【发布时间】: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 内部摸索的好方法。