web-dev-qa-db-ja.com

gdbにロードされていない共有ライブラリの関数にブレークポイントを設定する方法

dlopenを使用してメインプログラムにロードされる共有ライブラリ_libtest.so_があります。関数test()は_libtest.so_にあり、メインプログラムでdlsymを介して呼び出されます。 testにブレークポイントを設定する方法はありますか?

リンク時間中、メインプログラムは_libtest.so_にリンクされていないことに注意してください。それ以外の場合は、保留中のアクションですが、ブレークポイントを設定できるはずです。私の場合、_b test_を実行すると、gdbは_Function "test" not defined_を教えてくれます。

15
pierrotlefou

実際、gdbは、新しいライブラリがロードされたときに、将来シンボルを解決できることを通知するはずです。

(gdb) b test
Function "test" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (test) pending.
(gdb) r

その後、.soオブジェクトが読み込まれると、ブレークポイントが解決されます。例:

Reading symbols for shared libraries . done
Breakpoint 1 at 0xcafebebe
Pending breakpoint 1 - "test" resolved
14
diciu

実際、この方法は常に機能するとは限りません。

それぞれが「Init」という名前の関数を持つ複数の共有ライブラリがあるとします。別のライブラリをロードした場合、「b Init」は、関数「Init」の間違ったインスタンスにブレークポイントを設定します。したがって、次のようにブレークポイントを指定する必要があります。

(gdb)b object5.c:66

Object5.cという名前のソースファイルはありません。

8
Michael

共有ライブラリにブレークポイントを設定する方法。

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

https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html からの引用

(gdb)b object5.c:66object5.cという名前のソースファイルがありません。

「setdirectorythe_location_of_object5.c_file」を使用して修正できるかもしれません。

1
jasonxiaole

別の方法は、ファイル名とder関数を指定することです。例:

b object5.c:test

これは一意である必要があります。 (すでに提案されているように)ソースコードへのパスを次のように指定することもできます。

set directories path_of_object5.c
1
musbach