我在使用GDB调试多线程进程时遇到了一些问题。我有一个多线程进程,分裂成几个(8或9)不同的线程,并且我正在尝试确定在调用名为XML_File_Data的类的构造函数时变量的内容是什么。然而,我遇到了一个问题,在我将正确的函数断点应用于所有线程之后,显然其中一个线程的断点被触发(程序暂停执行),但我无法确定哪个线程触发了断点。命令
(gdb) thread apply all where
以以下形式向我提供了令人震惊的无用信息:
#0 0x004ab410 in __kernel_vsyscall ()
#1 0x05268996 in nanosleep () from /lib/libc.so.6
#2 0x052a215c in usleep () from /lib/libc.so.6
#3 0x082ee313 in frame_clock_frame_end (clock=0xb4bfd2f8)
at frame_clock.c:143
#4 0x003a349a in ?? ()
#5 0x00b5cfde in thread_proxy ()
from /cets_development_libraries/install/lib/libboost_thread-gcc41-mt-1_38.so.1.38.0
#6 0x02c1f5ab in start_thread () from /lib/libpthread.so.0
#7 0x052a8cfe in clone () from /lib/libc.so.6
在这9个进程中,大约有7个左右的输出几乎完全相同,而关于最后2个的信息并没有太多帮助(调用堆栈深处的函数具有可识别的名称,但是任何最近的#0-#4函数都不可识别)。
到目前为止,这就是我所拥有的。
(gdb) gdb
(gdb) gdb attach <processid>
(gdb) thread apply all 'XML_File_Data::XML_File_Data()'
并且(在断点被触发后)
(gdb) thread apply all where
有没有经验丰富的调试员可以给我一些提示,告诉我我做错了什么或者在这种情况下通常要做些什么?
谢谢, 查理
编辑:幸运的是,我找到了导致“??”的原因是在调试器中运行优化代码,另外也没有在可执行文件所在目录中运行调试器。尽管如此,调试还是没有取得多少成功。