dlopen
を使用してメインプログラムにロードされる共有ライブラリ_libtest.so
_があります。関数test()
は_libtest.so
_にあり、メインプログラムでdlsym
を介して呼び出されます。 test
にブレークポイントを設定する方法はありますか?
リンク時間中、メインプログラムは_libtest.so
_にリンクされていないことに注意してください。それ以外の場合は、保留中のアクションですが、ブレークポイントを設定できるはずです。私の場合、_b test
_を実行すると、gdbは_Function "test" not defined
_を教えてくれます。
実際、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
実際、この方法は常に機能するとは限りません。
それぞれが「Init」という名前の関数を持つ複数の共有ライブラリがあるとします。別のライブラリをロードした場合、「b Init」は、関数「Init」の間違ったインスタンスにブレークポイントを設定します。したがって、次のようにブレークポイントを指定する必要があります。
(gdb)b object5.c:66
Object5.cという名前のソースファイルはありません。
共有ライブラリにブレークポイントを設定する方法。
共有ライブラリ内にブレークポイントがあることは非常に一般的です。共有ライブラリは、プログラムの実行時に明示的に、場合によっては繰り返しロードおよびアンロードできます。このユースケースをサポートするために、gdbは、共有ライブラリがロードまたはアンロードされるたびにブレークポイントの場所を更新します。通常、デバッグセッションの開始時、ライブラリがロードされていないとき、およびライブラリのシンボルが使用できないときに、共有ライブラリにブレークポイントを設定します。ブレークポイントを設定しようとすると、gdbは、いわゆる保留中のブレークポイント(アドレスがまだ解決されていないブレークポイント)を設定するかどうかを尋ねます。
https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html からの引用
(gdb)b object5.c:66object5.cという名前のソースファイルがありません。
「setdirectorythe_location_of_object5.c_file」を使用して修正できるかもしれません。
別の方法は、ファイル名とder関数を指定することです。例:
b object5.c:test
これは一意である必要があります。 (すでに提案されているように)ソースコードへのパスを次のように指定することもできます。
set directories path_of_object5.c