2013-04-10 74 views
1

我使用gdb来附加到进程。我想弄清楚为什么它陷入了无限循环,以及它在做什么。我在gdb发出的命令backtrace,得到了这样的结果:解释gdb回溯

#0 0x000000000041cf30 in [email protected]() 
#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是什么意思?另外,可以肯定的是:第二列中的数字是内存中函数的地址吗?

+0

我会说'@ plt'是mangled函数名称的一部分。 (我认为第二列是呼叫站点的地址;在该地址进行反汇编,您将看到。) – Jens 2013-04-10 21:42:26

回答

0

我很确定“@plt”是名称的一部分。是的,第二列是你的地址。所以你现在可以输入“finish”,如果gdb没有让你回到短时间的提示,那么这意味着你的无限循环发生在toloc的free中。这可能是talloc库中的一个bug(我从来没有用过),或者更可能是你损坏了你的堆。你经常会发现,当使用glibc时,它会检测到堆损坏并给你一个漂亮的崩溃消息。

我会建议你在valgrind中运行你的程序 - 这是快速检测内存错误的好方法。

2

PLT是程序连接表。请参阅the documentation here。这用于延迟加载函数引用。

是不是总是卡在这里?这里是纯粹的猜想,但如果是这样的话,那可能表明这个功能仍然没有解决。例如,如果预期的库未加载。

是的,十六进制数字通常表示指令指针推入堆栈的值。您可以使用l * <address>命令验证这一点,以告知GDB列出该地址的代码行。或者使用f <frame#>命令切换到该堆栈帧。

试试看/proc/<pid>/maps(其中<pid>是此过程的PID),并查看您希望加载的文件库是否为talloc_free