【问题标题】:Determining the correct thread to debug in GDB确定要在 GDB 中调试的正确线程
【发布时间】:2010-07-19 15:19:47
【问题描述】:

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

任何有经验的调试器可以给我一些关于我做错了什么或在这种情况下通常会做什么的提示吗?

干杯, 查理

编辑:幸运的是,除了没有在可执行文件的目录中运行调试器之外,我还发现 ?? 的原因是优化代码正在通过调试器运行。但是调试仍然没有多大成功。

【问题讨论】:

    标签: gdb


    【解决方案1】:

    我发现自己一直在这样做:

    > t a a f
    

    缩写:

    > thread apply all frame
    

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

    > t a a bt 3
    

    打印每个线程堆栈的底部 3 帧。 (也可以使用负数获取栈顶N帧)

    【讨论】:

      【解决方案2】:

      您可以使用命令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 线程号左侧的星号“*”表示当前线程。见here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-16
        • 1970-01-01
        相关资源
        最近更新 更多