Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;获取不同线程的回溯跟踪_C++_C_Multithreading_Pthreads_Backtrace - Fatal编程技术网

C++ C++;获取不同线程的回溯跟踪

C++ C++;获取不同线程的回溯跟踪,c++,c,multithreading,pthreads,backtrace,C++,C,Multithreading,Pthreads,Backtrace,我希望了解我的软件中特定线程的状态,从另一个线程执行。 具体地说,我想知道它是否被I/O卡住了。 我想通过获取回溯来实现这一点(除非有人有其他想法?),因为我知道应该使用什么函数。。 但是我不知道如何在不调用SEGFAULT处理程序的情况下获取特定线程的回溯。。。但gdb有能力做到这一点(我怀疑他会制造错误…) 有人能帮忙吗?有什么想法吗 [编辑]所有3个答案都是关于gdb的,我知道我可以从gdb做这件事,我想知道如何从软件做这件事(即使链接到gdb libs也会是一个答案,但怎么做?) 我知道

我希望了解我的软件中特定线程的状态,从另一个线程执行。 具体地说,我想知道它是否被I/O卡住了。 我想通过获取回溯来实现这一点(除非有人有其他想法?),因为我知道应该使用什么函数。。 但是我不知道如何在不调用SEGFAULT处理程序的情况下获取特定线程的回溯。。。但gdb有能力做到这一点(我怀疑他会制造错误…)

有人能帮忙吗?有什么想法吗

[编辑]所有3个答案都是关于gdb的,我知道我可以从gdb做这件事,我想知道如何从软件做这件事(即使链接到gdb libs也会是一个答案,但怎么做?)

我知道它应该被固定在什么功能上。。但我不明白 了解如何获取特定线程的回溯跟踪

您可以获取所有线程的回溯,并尝试在回溯输出中查找应该被卡住的函数。以下是如何在gdb中获取所有回溯:

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

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

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


Ref

因为您知道您认为自己被哪个函数卡住了,所以可以在该函数开始时设置一个断点。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

上面给出了线程列表,活动线程的*作为断点,然后是回溯。

在Linux上,您可以轻松打开
/proc//stat
(或
/proc//task//stat
)并读取堆栈和指令指针。你的平台要求是什么?如果你知道你认为你可能会被困在什么功能中——你能不能在进入和离开该功能时设置并清除一个标志,并将其指示给其他线程?你需要哪个平台?@soren,不适用于高多线程故障检测。如果所检查的线程正在运行,您将无法可靠地执行此操作。虽然很有趣(+1),但OP特别询问如何在软件中执行此操作,而不是从gdbAs Soren评论道,我需要知道如何从软件而不是从gdb执行此操作。@Alon,gdb本身使用libthread_db library列出线程,因此您可以在应用程序中执行相同的操作。首先,您需要加载它(这不是很明显)。请参阅此博客,了解如何加载:。