c++获取不同线程的回溯
C++ get backtrace of a different thread
我希望了解我的软件中特定线程的状态,从另一个线程执行。特别是我想知道它是否被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
上面的代码会给你一个线程列表,其中*代表活动线程的断点,后面跟着反跟踪。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 为什么std::async使用同一个线程运行函数
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- c++获取不同线程的回溯
- 来自回溯的堆栈跟踪未显示导致多线程环境下崩溃的方法