我希望了解我的软件中特定线程的状态,从另一个线程执行。 具体来说,我想知道它的I / O是否卡住了。 我想通过获取回溯来做到这一点(除非有人有另一个想法?),因为我知道它应该被困在什么功能上...... 但我无法弄清楚如何在不调用SEGFAULT处理程序的情况下获得该特定线程的回溯...但gdb能够做到(我怀疑他是否创建了SEGFAULTS ......)
有人可以帮忙吗?任何想法?
[编辑]所有3个答案都参考gdb,我知道我可以从gdb做到这一点,我想知道如何从软件中做到这一点(甚至链接到gdb libs不知何故会是一个答案,但是如何?)< / p>
答案 0 :(得分:4)
我知道应该坚持的功能......但我无法理解 如何获得该特定线程的回溯
您可以回溯所有线程,并尝试查找应该在backtraces输出中停留的函数。以下是如何在gdb中获取所有回溯:
(gdb) thread apply all bt
答案 1 :(得分:1)
(gdb)info threads [将列出所有线程,并指出您当前正在回溯的线程]
(gdb)线程应用所有bt [将显示所有线程的回溯,以便您可以在切换到该线程之前查看哪个线程卡在您感兴趣的函数上]
(gdb)线程#threadno [会将回溯切换到您感兴趣的特定线程,而bt将显示其回溯。]
答案 2 :(得分:0)
既然你知道你认为自己被困在哪个功能上,你可以在该功能的开头设置一个断点。 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
上面将给出线程列表,其中*为断点的活动线程,后跟回溯。