【问题标题】:Printing thread hierarchy with GDB使用 GDB 打印线程层次结构
【发布时间】:2014-08-05 14:36:46
【问题描述】:

我有一个正在尝试调试的多线程程序。当我在 GDB 中运行 info thread 时,我得到以下信息:

(gdb) info thread
  Id   Target Id         Frame 
  8    Thread 0x7fffe77fd700 (LWP 17425) "SocketWriter" 0x00007ffff7bc9b2f in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
  7    Thread 0x7fffe73fc700 (LWP 17426) "SocketWriter" 0x00007ffff7bc9b2f in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
  6    Thread 0x7fffe7fff700 (LWP 17423) "SocketReader" 0x00007ffff7bcc66d in read () from /usr/lib/libpthread.so.0
  5    Thread 0x7fffe7bfe700 (LWP 17424) "SocketReader" 0x00007ffff7bcc66d in read () from /usr/lib/libpthread.so.0
* 4    Thread 0x7ffff4810700 (LWP 17422) "unittest" 0x00007ffff7bcc38c in __lll_lock_wait () from /usr/lib/libpthread.so.0
  3    Thread 0x7ffff4c11700 (LWP 17421) "receiver" 0x00007ffff7bcc38c in __lll_lock_wait () from /usr/lib/libpthread.so.0
  2    Thread 0x7ffff5a3b700 (LWP 17420) "unittest" 0x00007ffff634e553 in select () from /usr/lib/libc.so.6
  1    Thread 0x7ffff7fc9780 (LWP 17419) "unittest" 0x00007ffff7bc9b2f in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0

如果我可以让 GDB 显示线程之间的父/子关系,那就太好了,如下所示:

(gdb) info thread
  Id   Target Id         Frame 
  1    Thread 0x7ffff7fc9780 (LWP 17419) "unittest" 0x00007ffff7bc9b2f in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
    3    Thread 0x7ffff4c11700 (LWP 17421) "receiver" 0x00007ffff7bcc38c in __lll_lock_wait () from /usr/lib/libpthread.so.0
      8    Thread 0x7fffe77fd700 (LWP 17425) "SocketWriter" 0x00007ffff7bc9b2f in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
      6    Thread 0x7fffe7fff700 (LWP 17423) "SocketReader" 0x00007ffff7bcc66d in read () from /usr/lib/libpthread.so.0
      2    Thread 0x7ffff5a3b700 (LWP 17420) "unittest" 0x00007ffff634e553 in select () from /usr/lib/libc.so.6
    5    Thread 0x7fffe7bfe700 (LWP 17424) "SocketReader" 0x00007ffff7bcc66d in read () from /usr/lib/libpthread.so.0
*   4    Thread 0x7ffff4810700 (LWP 17422) "unittest" 0x00007ffff7bcc38c in __lll_lock_wait () from /usr/lib/libpthread.so.0
    7    Thread 0x7fffe73fc700 (LWP 17426) "SocketWriter" 0x00007ffff7bc9b2f in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0

例如,线程 3 是线程 8、6 和 2 的父级,线程 1 是所有内容的父级。

是否存在这样的功能?如果有的话,我还没有看到对它的引用。

【问题讨论】:

标签: multithreading gdb


【解决方案1】:

gdb 不会打印此信息,因为它在您的程序中不存在——一旦创建线程,gdb 就无法发现它。

可能有两种方法可以做到。

首先,您可以在线程创建函数上设置断点并记录信息。这很容易从 Python 完成。然后你可以写一个新的命令,同样用 Python,以你喜欢的方式格式化输出。

这种方法的问题在于,如果您“附加”到正在运行的程序,它就无法工作。捕捉信息为时已晚。

另一种方法是,如果您的程序中有描述层次结构的额外信息可用。然后,您可以在 Python 中编写一个新命令来提取此信息以显示您喜欢的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2019-08-07
    • 2015-06-30
    • 1970-01-01
    相关资源
    最近更新 更多