我想了解如何从另一个线程中获取特定线程在软件中的状态,特别是是否出现了I/O阻塞。我考虑通过获取回溯信息(除非有其他想法?)来实现,因为我知道它应该卡在哪个函数上了。但我无法弄清楚如何获取特定线程的回溯信息,而不调用SEGFAULT处理程序。gdb可以做到这一点(我怀疑它会创建SEGFAULTS..)。有人能帮忙吗?有什么想法吗?[编辑]所有3个答案都提到了gdb,我知道我可以从gdb中进行操作,但我想知道如何从软件中实现(即使链接到gdb库也是一个答案,但是如何实现呢?)
(gdb) thread apply all bt
(gdb) info threads [将列出所有线程,并指示您当前正在回溯的线程]
(gdb) thread apply all bt [将显示所有线程的回溯,以便您可以查看哪个线程在您感兴趣的函数上卡住,然后切换到该线程]
(gdb) thread #threadno [将切换回溯到您感兴趣的特定线程,bt 将显示其回溯。]
既然你知道你认为自己卡住的函数是哪个,那么你可以在该函数的开头设置一个断点。GDB允许你将一系列命令附加到断点上,在断点被触发时自动执行这些命令,从而允许你打印出执行该断点时正在执行的线程的回溯信息。
(gdb) break filename:line
(gdb) commands
Type commands for breakpoint(s) 1, one per line
End with a line saying just "end"
>info threads
>bt
>continue
>end
以上代码将给出线程列表,在断点处由活动线程标有*,随后是回溯信息。
/proc/<pid>/stat
(或/proc/<pid>/task/<tid>/stat
)并读取堆栈和指令指针。您的平台要求是什么? - Useless