1

以下のようなコードが含まれるソースファイル shared_lib_test.c があります。

10 void test_function(void)
11 {
12    do_me();
13    skip_me();
14    return;
15 }

gdb を使用して 13 行目をスキップしたいのですが、どうすればよいですか? この関数は、バイナリではなく共有ライブラリに属しています。

この関数がバイナリに属している場合、次のコマンドを使用して実行できます。

b shared_lib_test.c:13
commands 1
jump 14
continue
end

しかし、これは共有ライブラリに属しているため、ソース ファイルの正確な行番号にブレーク ポイントを設定できませんでした。

4

1 に答える 1

2

共有ライブラリをデバッグするには、使用する必要があります

set breakpoint pending-- 保留中のブレークポイントに関するデバッガーの動作を設定します。

共有ライブラリ内にブレークポイントを設定することは非常に一般的です。共有ライブラリは、プログラムの実行時に明示的にロードおよびアンロードでき、場合によっては繰り返し実行できます。この使用例をサポートするために、共有ライブラリがロードまたはアンロードされるたびに、gdb はブレークポイントの場所を更新します。通常、デバッグ セッションの開始時、ライブラリがロードされていないとき、およびライブラリのシンボルが使用できないときに、共有ライブラリにブレークポイントを設定します。ブレークポイントを設定しようとすると、gdb はいわゆるペンディング ブレークポイント (アドレスがまだ解決されていないブレークポイント) を設定するかどうかを尋ねます。

gdb には、「break」コマンドがブレークポイント アドレス指定をアドレスに解決できない場合に何が起こるかを制御するための追加コマンドがいくつか用意されています。

set breakpoint pending auto これがデフォルトの動作です。gdb がブレークポイントの場所を見つけられない場合、保留中のブレークポイントを作成する必要があるかどうかを問い合わせます。

set breakpoint pending on これは、ブレークポイントの場所が認識されない場合、保留中のブレークポイントが自動的に作成されることを示します。

set breakpoint pending off これは、保留中のブレークポイントが作成されないことを示します。認識されないブレークポイントの場所があると、エラーが発生します。この設定は、以前に作成された保留中のブレークポイントには影響しません。

show breakpoint pending 保留中のブレークポイントを作成するための現在の動作設定を表示します。

あなたの質問に来ます。つまり、行をスキップする

jump +1コードがその共有ライブラリ行 (skip_me()) の前に達したときに使用します。

参考文献

http://wiki.documentfoundation.org/Development/How_to_debug

gdb: --command フラグを使用して将来の共有ライブラリにブレークポイントを設定する方法

http://bhushanverma.blogspot.in/2009/08/how-to-debug-shared-library-using-gdb.html

http://www.toptip.ca/2010/06/gdb-skip-instructions-or-lines-while.html

gdb を使用して行をスキップできますか?

于 2012-11-06T10:16:15.427 に答える