确定要在GDB中调试的正确线程
我在使用GDB调试多线程进程时遇到了一些问题。我有一个多线程进程,它分裂成几个(8或9个)不同的线程,我试图确定在调用名为XML_File_Data的类的构造函数时变量的内容是什么。然而,我遇到了一个问题,在我将正确的函数断点应用于所有线程之后,很明显,线程的一个断点被击中(程序暂时停止执行),我无法确定哪个线程击中了断点。命令确定要在GDB中调试的正确线程,gdb,Gdb,我在使用GDB调试多线程进程时遇到了一些问题。我有一个多线程进程,它分裂成几个(8或9个)不同的线程,我试图确定在调用名为XML_File_Data的类的构造函数时变量的内容是什么。然而,我遇到了一个问题,在我将正确的函数断点应用于所有线程之后,很明显,线程的一个断点被击中(程序暂时停止执行),我无法确定哪个线程击中了断点。命令 (gdb) thread apply all where 在表格中给了我惊人的无用信息: #0 0x004ab410 in __kernel_vsyscall ()
(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()'
有经验的调试器可以给我一些提示,说明我做错了什么,或者在这种情况下通常会做什么
干杯,
查理
编辑:幸运的是,我能够发现,除了没有在可执行文件的目录中运行调试器之外,导致???的原因是通过调试器运行的优化代码。但调试仍然没有多大成功。您可以使用命令thread或info 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线程编号左侧的星号“*”表示当前线程。看。我发现自己一直在这样做:
> t a a f
简称:
> thread apply all frame
当然,也可以使用其他变体:
> t a a bt 3
它将打印每个线程堆栈的底部3帧。(也可以使用负数获得堆栈的前N帧)
> t a a bt 3