使用gdb和pthreads获取有关线程的编程信息

时间:2011-07-12 21:23:48

标签: c gdb

使用gdb,我可以输入'info threads'或'thread apply all backtrace'来获取我所有线程的列表以及他们正在做的事情。

我想编写一个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,它对应于作为'info thread'输出的一部分显示的线程指针:

(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成员与输出中的线程地址相同,但我无法找到任何方法来利用这一事实的编程优势。

有人知道这样做的方法吗?

1 个答案:

答案 0 :(得分:2)

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

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

source source.py