dlopen()で読み込んだ共有ライブラリにブレークポイントを設定するには.

dlopen()で読み込んだ共有ライブラリ内の関数にブレークポイントを設定する方法.

gdb では,dlopen()してdlsym()した関数には通常の方法でブレークポイントが設定できない.これは,共有ライブラリ中のシンボル情報が自動で読み込まれないため.

手動でシンボル情報を読み込ませる方法としては,たとえば以下の方法がある.
http://lists.gnu.org/archive/html/bug-gdb/2001-05/msg00061.html

具体的には,まず

(gdb) info shared

0x3000104a080       0x30002820c00       No          /usr/lib/mylib.so

でシンボルが読み込まれた領域(text)の先頭アドレス(0x300104a080)をしらべる.


次に,add-symbol-file コマンドでシンボル情報を持つ共有ライブラリ(mylib.so)を読み込ませる.この時,先ほど調べたアドレスを指定する.

(gdb) add-symbol-file /usr/lib/mylib.so 0x3000104a080
add symbol table from file "/usr/lib/mylib.so" at
        .text_addr = 0x3000104a080
(y or n) y
Reading symbols from /usr/lib/mylib.so...done.

面倒だが,以上でシンボル情報が読み込まれるので普通にブレークポイントが設定できるようになる.