在GDB中确定正确的线程进行调试

10

我在使用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

有没有经验丰富的调试员可以给我一些提示,告诉我我做错了什么或者在这种情况下通常要做些什么?

谢谢, 查理

编辑:幸运的是,我找到了导致“??”的原因是在调试器中运行优化代码,另外也没有在可执行文件所在目录中运行调试器。尽管如此,调试还是没有取得多少成功。

2个回答

19

我经常这样做:

> t a a f

缩写:

> thread apply all frame

当然,其他变体也是可能的:

> t a a bt 3

该命令打印出每个线程堆栈的最后3个帧。(您也可以使用负数获取堆栈的前N个帧)


15

在断点触发后,您可以使用命令threadinfo threads来查找当前的线程编号。

(gdb) thread
[Current thread is 1 (Thread 0xb790d6c0 (LWP 2519))]
(gdb)

(gdb) info threads
  17 Thread 0xb789cb90 (LWP 2536)  0xb7fc6402 in __kernel_vsyscall ()
  16 Thread 0xb769bb90 (LWP 2537)  0xb7fc6402 in __kernel_vsyscall ()
  15 Thread 0xb749ab90 (LWP 2543)  0xb7fc6402 in __kernel_vsyscall ()
  14 Thread 0xb7282b90 (LWP 2544)  0xb7fc6402 in __kernel_vsyscall ()
  13 Thread 0xb5827b90 (LWP 2707)  0xb7fc6402 in __kernel_vsyscall ()
  12 Thread 0xb5626b90 (LWP 2708)  0xb7fc6402 in __kernel_vsyscall ()
  11 Thread 0xb5425b90 (LWP 2709)  0xb7fc6402 in __kernel_vsyscall ()
  10 Thread 0xb5161b90 (LWP 2713)  0xb7fc6402 in __kernel_vsyscall ()
  9 Thread 0xb4ef9b90 (LWP 2715)  0xb7fc6402 in __kernel_vsyscall ()
  8 Thread 0xb4af7b90 (LWP 2717)  0xb7fc6402 in __kernel_vsyscall ()
  7 Thread 0xb46ffb90 (LWP 2718)  0xb7fc6402 in __kernel_vsyscall ()
  6 Thread 0xb44feb90 (LWP 2726)  0xb7fc6402 in __kernel_vsyscall ()
  5 Thread 0xb42fdb90 (LWP 2847)  0xb7fc6402 in __kernel_vsyscall ()
  4 Thread 0xb40fcb90 (LWP 2848)  0xb7fc6402 in __kernel_vsyscall ()
  3 Thread 0xb3efbb90 (LWP 2849)  0xb7fc6402 in __kernel_vsyscall ()
  2 Thread 0xb3cfab90 (LWP 2850)  0xb7fc6402 in __kernel_vsyscall ()
* 1 Thread 0xb790d6c0 (LWP 2519)  0xb7fc6402 in __kernel_vsyscall ()
(gdb)

在 gdb 线程号左边有一个星号 `*' 表示当前线程。请参考这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接