【问题标题】:Get programmatic info on threads using gdb and pthreads使用 gdb 和 pthreads 获取有关线程的编程信息
【发布时间】:2011-10-04 00:29:51
【问题描述】:

使用 gdb,我可以输入“信息线程”或“线程应用所有回溯”来获取我所有线程的列表以及它们在做什么。

我想编写一个 gdb 宏,它会列出所有正在运行的线程。该宏将检索线程号(即 gdb 'thread' 命令的参数),然后将获取我已定义并存储在线程本地存储中的线程的名称。

在伪代码中,这看起来像:

for each thread in threads
    t thread
    f 1
    set $name = my_name
    f top
    printf "Thread %d has name %s and is currently doing %s\n", thread, $name, curr_frame
next

获取 curr_frame 的字符串可能会有一些小的复杂性,但如果我能在剩下的部分中找到一个好的框架,我愿意暂时省略它。

我的程序中有一个线程列表,为此我可以获得与作为“信息线程”输出的一部分显示的线程指针相对应的 pthread_t:

(gdb) info thread
....
30 Thread 0x5221c940 (LWP 25304)  0x00000031c5a0aee9 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
....
(gdb) p *(_thread_t*)my_threads[0].pid
$4 = {
  t_id = 0x5221c940,

如您所见,t_id 成员与输出中的线程地址相同,但我真的找不到任何方法来利用这一事实。

有人知道怎么做吗?

【问题讨论】:

  • 你能找到单个线程堆栈基址的内存地址并利用它的偏移量吗?
  • thread apply all bt full 没有帮助吗?
  • @Nikolai - 不!目标是不必解析 70 个线程的回溯。
  • @JAB - 可能不会,除非你知道通过在 pthread_t 内部摸索的好方法。

标签: c gdb


【解决方案1】:

从 7.0 版开始,GDB 可以在 python 中编写脚本,因此您几乎可以按原样实现您的伪代码。有关访问线程 here 和获取堆栈帧 here 的信息,请参阅文档。

我认为最简单的方法是将您的程序编写在source.py 文件中,然后在 GDB 中运行:

source source.py

【讨论】:

  • 这是最终的答案,是的。遗憾的是,我们还没有使用 gdb 7。
  • 虽然在 GDB 7.0 中添加了 Python 脚本,但仅在 GDB 7.2 中添加了 Python 线程支持。使用 GDB 7.3,在 Linux 上,“信息线程”将自动显示线程名称(如果应用程序通过 PR_SET_NAME prctl() 调用设置它)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 2014-08-29
相关资源
最近更新 更多