1

以前gdbはプロセスにアタッチしていました。無限ループに陥っている理由と、それが何をしているのかを理解しようとしています。コマンドを発行したbacktraceところ、次のgdb結果が得られました。

#0  0x000000000041cf30 in _talloc_free@plt ()
#1  0x0000000000452320 in winbindd_reinit_after_fork ()
#2  0x00000000004524e6 in fork_domain_child ()
#3  0x0000000000453585 in wb_child_request_trigger ()
#4  0x000000381d2048e2 in tevent_common_loop_immediate () from /lib64/libtevent.so.0
#5  0x00007fbed6b98e17 in run_events_poll () from /lib64/libsmbconf.so.0
#6  0x00007fbed6b9922e in s3_event_loop_once () from /lib64/libsmbconf.so.0
#7  0x000000381d204060 in _tevent_loop_once () from /lib64/libtevent.so.0
#8  0x000000000042049a in main ()

私の質問は: 最初の行の @ 記号はどういう意味ですか? _talloc_freeそれが関数であることは知っていますが、どういう@plt意味ですか? また、念のため: 2 列目の数値はメモリ内の関数のアドレスですか?

4

2 に答える 2

2

PLT はProcedure Linkage Tableです。こちらのドキュメントを参照してください。これは、関数参照の遅延読み込みに使用されます。

いつもここにくっついていますか?ここでは純粋な推測ですが、そうであれば、関数が未解決のままであることを示している可能性があります。たとえば、予期されたライブラリがロードされていない場合です。

はい、16 進数は通常、スタックにプッシュされた命令ポインターの値を示します。コマンドでこれを確認して、l * <address>GDB にそのアドレスのコード行をリストするように指示できます。または、f <frame#>コマンドを使用してそのスタック フレームに切り替えます。

/proc/<pid>/maps(このプロセスの PID はどこに<pid>ありますか) を見て、期待するライブラリtalloc_freeがロードされているかどうかを確認してください。

于 2013-04-10T23:12:13.053 に答える
0

「@plt」が名前マングリングの一部であることは確かです。はい、2列目はあなたの住所です。ここで「finish」と入力しても、gdb がすぐにプロンプ​​トに戻らない場合は、talloc の free で無限ループが発生していることを意味します。これは、talloc ライブラリのバグ (私は一度も使用したことがありません) であるか、ヒープが破損している可能性が高いです。glibc を使用すると、ヒープの破損が検出され、かなりのクラッシュ メッセージが表示されることがよくあります。

プログラムを valgrind で実行することをお勧めします。これは、メモリ エラーをすばやく検出する優れた方法です。

于 2013-04-10T23:06:56.400 に答える