4

Cで記述されたLinuxダイナミックライブラリを監視(デバッグ)し
たいと思います。いつ、どのパラメータがライブラリに渡されるかを確認したいと思います。

'X'を監視するライブラリは、別のダイナミックライブラリ'Y'によって呼び出されます。
'Xと'Y'の両方が実行可能ファイル'A'の/proc/ pid/mapsに表示されます。

ltraceを使用すると、実行可能ファイルでlibXまたはYが表示されませんでした。
実行可能ファイルは複数のスレッドを使用しています。

また、execでlddコマンドを使用する場合、libs XまたはYについては何も言及されていません
。lddYは、YにXが必要であることを示しています。

すべてのライブラリでlddを使用すると、プロジェクトのexecはYを必要とする人について言及しません。
それでもYはexecの/ proc / pid/mapsにロードされているように見えます。

X libをデバッグするためにどのような手順を実行できるかわかりませんが、アドバイスをいただければ幸いです。

4

1 に答える 1

4

user756235がgdbで実行できる場合、これはthisthisを使用するアプローチです。唯一の質問は、共有ライブラリXの関数の完全なリストを作成することです。nm ./libX.so | grep "T "

次に、.gdbinitを作成します(私の場合、の引数を制御しますprint_in_lib):

host: srv2-x64rh5-01, OS: Linux 2.6.18-238.el5>more .gdbinit
file main
set pagination off
set logging file gdb.txt
set breakpoint pending on
set logging on
b print_in_lib
commands
info args
continue
end
r
set logging off
quit

そして私が走るときgdb

ホスト:srv2-x64rh5-01、OS:Linux 2.6.18-238.el5>gdb-q関数"print_in_lib"が定義されていません。ブレークポイント1(print_in_lib)は保留中です。警告:0x2aaaaaaab000千の追加されたシンボルファイルシステム提供のDSOにロード可能なセクションが見つかりません:1 print_debug:0

ブレークポイント1、print_in_lib(print_debug = 0、index = 0)at my_lib.cpp:7 7 if(print_debug){print_debug = 0 index = 0

ブレークポイント1、print_in_lib(print_debug = 0、index = 1)at my_lib.cpp:7 7 if(print_debug){print_debug = 0 index = 1

ブレークポイント1、print_in_lib(print_debug = 0、index = 2)at my_lib.cpp:7 7 if(print_debug){print_debug = 0 index = 2

ブレークポイント1、print_in_lib(print_debug = 0、index = 3)at my_lib.cpp:7 7 if(print_debug){print_debug = 0 index = 3

于 2012-07-02T10:33:24.223 に答える