c++获取不同线程的回溯



我希望了解我的软件中特定线程的状态,从另一个线程执行。特别是我想知道它是否被I/O卡住了。我想通过回溯来做这件事(除非有人有另一个想法?),因为我知道它应该被卡住的函数是什么…但我不知道如何获得该特定线程的回溯,而不调用SEGFAULT处理程序…但是gdb能够做到这一点(我怀疑他会创建segfault ..)

有人能帮忙吗?任何想法?

[编辑]所有3个答案都是指gdb,我知道我可以从gdb中做到这一点,我想知道如何从软件中做到这一点(甚至链接到gdb库以某种方式将是一个答案,但如何?)

我知道它应该被卡住的功能…但我不明白了解如何获得该特定线程的回溯跟踪

您可以获得所有线程的回溯,并尝试找到应该在回溯输出中卡住的函数。下面是在gdb中获取所有回溯的方法:

(gdb) thread apply all bt

(gdb) info threads[将列出所有线程,并指出当前正在回溯的线程]

(gdb) thread apply all bt[将显示所有线程的回溯,以便您可以在切换到感兴趣的线程之前看到哪个线程卡住了函数]

(gdb) thread #threadno[将把回溯跟踪切换到您感兴趣的特定线程,并显示其回溯跟踪。]

Ref http://www.delorie.com/gnu/docs/gdb/gdb_25.html

既然您知道您认为卡住了哪个函数,那么您可以在该函数的开头设置一个断点。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

上面的代码会给你一个线程列表,其中*代表活动线程的断点,后面跟着反跟踪。

最新更新