在Linux中,要获得回溯,可以使用backtrace()库调用,但它只返回当前线程的回溯。有没有办法得到一些其他线程的回溯,假设我知道它的TID(或pthread_t),我可以保证它睡觉?
似乎libunwind(http://www.nongnu.org/libunwind/)项目可以提供帮助。问题是CentOS不支持它,所以我不想使用它。
还有其他想法吗? 感谢。
答案 0 :(得分:10)
我自己实现了here。
最初,我想实现与建议的here类似的东西,即以某种方式获取线程的顶部框架指针并手动展开它(链接源源自Apples backtrace
实现,因此可能是特定于Apple的,但这个想法是通用的。)
但是,要保证安全(并且上面的源不是,甚至可能会被破坏),您必须在访问其堆栈时挂起该线程。我四处寻找暂停线程的不同方法,找到了this,this和this。基本上,没有什么好办法。常见的hack(used by the Hotspot JAVA VM)是使用信号并通过pthread_kill向您的主题发送自定义信号。
所以,正如我需要这样的信号黑客,我可以让它更简单一点,只需在目标线程中执行的被叫信号处理程序中使用backtrace
(同样建议{{3} })。这基本上就是我的实现。
如果您还对打印回溯感兴趣,即获取一些有用的调试信息(函数名称,源代码文件名,源代码行号......),请阅读here by sandeep关于扩展backtrace_symbols
的信息。基于libbfd。或者只看到来源here。
答案 1 :(得分:8)
借助回溯信号处理可以解决您的目的。
我的意思是如果你有一个Thread的PID,你可以为该线程发出一个信号。在处理程序中,您可以使用回溯。因为处理程序将在该partucular线程中执行,所以backtrace将是输出所需的输出。
答案 2 :(得分:0)
gdb为调试多线程程序提供了这些功能:
所以只需通过cmd转到GDB中所需的线程:'thread thread-id'。 然后在该线程上下文中执行'bt'以打印线程回溯。