确定要在GDB中调试的正确线程

can*_*ews 9 gdb

我在使用GDB调试多线程进程时遇到了一些问题.我有一个多线程进程,分裂成几个(8或9)个不同的线程,我试图确定当调用名为XML_File_Data的类的构造函数时变量的内容是什么.但是,我遇到了一个问题,在我将所有线程应用正确的函数断点后,显然其中一个线程的断点被命中(程序暂时停止执行),我无法确定哪个线程打破了断点.命令

(gdb) thread apply all where
Run Code Online (Sandbox Code Playgroud)

在形式上给我一些令人震惊的无用信息:

#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
Run Code Online (Sandbox Code Playgroud)

在9个进程中,大约7个正在给我几乎完全相同的输出,并且关于最后2个的信息实际上并没有多大帮助(远离调用堆栈的函数具有可识别的名称,但是最近的#0-#4函数无法识别).

这是我到目前为止:

(gdb) gdb
(gdb) gdb attach <processid>
(gdb) thread apply all 'XML_File_Data::XML_File_Data()'
Run Code Online (Sandbox Code Playgroud)

和(在断点被击中后)

(gdb) thread apply all where
Run Code Online (Sandbox Code Playgroud)

任何经验丰富的调试器能否为我提供一些关于我做错了什么或者在这种情况下通常做什么的提示?

干杯,查理

编辑:幸运的是,我能够发现,除了不在可执行文件的目录中运行调试器之外,问题的原因是通过调试器运行的优化代码.尽管调试仍然没有太大的成功.

Jam*_*mes 17

我发现自己一直这样做:

> t a a f
Run Code Online (Sandbox Code Playgroud)

短缺:

> thread apply all frame
Run Code Online (Sandbox Code Playgroud)

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

> t a a bt 3
Run Code Online (Sandbox Code Playgroud)

它打印每个线程堆栈的底部3帧.(您也可以使用负数来获得堆栈的前N帧)


ks1*_*322 15

您可以使用命令线程信息线程来查找断点命中后的当前线程数

(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)
Run Code Online (Sandbox Code Playgroud)

gdb线程编号左侧的星号"*"表示当前线程.看到这里.