10

GDB にラップされた GUI ベースのデバッガーを作成したいと考えています。なぜなら、ウォッチポイントやブレークポイントの後にプログラムを停止させたくないからです。代わりに、ファイル名、行番号、新しい値、スタッフなどの詳細をファイルにリダイレクトして、実行を続行する必要があります。

私はスクリプトがかなり苦手です。ですから、GDB のフロント エンドの開発を開始するための出発点が必要です。私がググった限り、このリンクhttp://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_211.htmlは、このアクティビティの初心者にはあまり理解できませんか?

うまくいけば、C/C++ での開発に関する助けが得られるでしょう。

4

4 に答える 4

14

GDB フロントエンドを作成するために、実際にはGDB/MIプロトコルを使用したいのですが、おそらくリンク先の古いものではなく、この最新のコピーを読んください。

サンプル GDB/MI セッション

( GDB マニュアルのこのセクションを軽く編集したバージョン)

MI Command Interpreter を使用した GDB の起動

$ gdb -q --interpreter=mi2
=thread-group-added,id="i1"
(gdb)

ファイル /bin/true

-file-exec-and-symbols /bin/true
^done
(gdb) 

休憩メイン

-break-insert main
^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x00000000004014c0",func="main",file="true.c",fullname="/usr/src/debug/coreutils-8.17/src/true.c",line="59",times="0",original-location="main"}
(gdb) 

実行とブレークポイント ヒット

-exec-run
=thread-group-started,id="i1",pid="2275"
=thread-created,id="1",group-id="i1"
^running
*running,thread-id="all"
(gdb) 
=library-loaded,id="/lib64/ld-linux-x86-64.so.2",target-name="/lib64/ld-linux-x86-64.so.2",host-name="/lib64/ld-linux-x86-64.so.2",symbols-loaded="0",thread-group="i1"
=library-loaded,id="/lib64/libc.so.6",target-name="/lib64/libc.so.6",host-name="/lib64/libc.so.6",symbols-loaded="0",thread-group="i1"
=breakpoint-modified,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x00000000004014c0",func="main",file="true.c",fullname="/usr/src/debug/coreutils-8.17/src/true.c",line="59",times="1",original-location="main"}
*stopped,reason="breakpoint-hit",disp="keep",bkptno="1",frame={addr="0x00000000004014c0",func="main",args=[{name="argc",value="1"},{name="argv",value="0x7fffffffde98"}],file="true.c",fullname="/usr/src/debug/coreutils-8.17/src/true.c",line="59"},thread-id="1",stopped-threads="all",core="1"
(gdb) 

継続する

-exec-continue
^running
*running,thread-id="1"
(gdb) 
=thread-exited,id="1",group-id="i1"
=thread-group-exited,id="i1",exit-code="0"
*stopped,reason="exited-normally"

GDB の終了

(gdb) 
-gdb-exit
^exit

既存の GDB/MI クライアント

C、C++、Java、Python での GDB/MI クライアントの実装がいくつかあります。読みやすいと思うものをいくつかリストします。

  • 非アクティブなlibmigdbプロジェクト (サンプル プログラムパブリック インターフェイス) -- 幸いなことに、これは再利用可能な C ライブラリを作成する試みです。悪いニュースは、それが十分に維持されていないことです。たとえば、GDBノンストップモードとキャッチポイントコマンドのサポート、ユース ケースで必要になる可能性が高い機能が欠落していると思います。
  • python-gdb-mi -- Python の知識があればかなり読みやすい
  • QtCreatorのC++ GDB/MI クライアント コード-- また、複数のデバッガ エンジンをサポートするために抽象化層の一部として記述されていますが、非常に読みやすいです。

このGDB フロントエンドのリストも参照することをお勧めします。

于 2013-05-27T12:26:38.523 に答える
2

すでに gdb/mi インターフェースを指摘しているので、おそらく既存のソリューションから、ニーズに対処する方法についてのアイデアが得られるかもしれません。以下は、既存のインターフェースのリストです。彼らのアプローチと、さまざまな問題にどのように対処しているかを見てください。

役立つ可能性のある別のアプローチは、自動化されたセッションです。gdb GUI の作成を思いとどまらせるわけではありませんが、このような自動化は、必要な手順を理解するための良い出発点になる可能性があり、開始点としても使用できる可能性があります。おそらくセッションスクリプトを生成し、それを使って gdb を起動します。gdb -x コマンド ファイルをロードします。

ここに自動化に関するリンクがあります: GDBデバッグセッションを自動化する最良の方法は何ですか?

お役に立てば幸いです。幸運を!

于 2013-05-27T12:27:34.087 に答える
1

目標を達成するために gdb ラッパーをプログラミングするのは、大変な作業です。

ブレークポイント ヒットでスクリプトを実行する方法を参照してください: gdb スクリプト: 選択したブレークポイントでコマンドを実行

gdb トレースポイントも参照してください: http://sourceware.org/gdb/onlinedocs/gdb/Tracepoints.html

于 2013-05-27T12:26:26.320 に答える