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