获得其他线程的回溯

Ale*_*ler 17 linux multithreading backtrace

在Linux中,要获得回溯,您可以使用backtrace()库调用,但它只返回当前线程的回溯.有没有办法得到一些其他线程的回溯,假设我知道它的TID(或pthread_t),我可以保证它睡觉?

似乎libunwind(http://www.nongnu.org/libunwind/)项目可以提供帮助.问题是CentOS不支持它,所以我不想使用它.

还有其他想法吗?谢谢.

Alb*_*ert 10

在这里实现了这一点.

最初,我想实现与此处建议的类似的东西,即以某种方式获取线程的顶部框架指针并手动展开它(链接源源自Apples backtrace实现,因此可能是Apple特定的,但这个想法是通用的).

但是,要保证安全(并且上面的源代码不是,甚至可能会被破坏),您必须在访问其堆栈时挂起该线程.我四处寻找悬挂线程的不同方法,发现了这个,这个这个.基本上,没有什么好办法.Hotspot JAVA VM使用的常见黑客是使用信号并通过pthread_kill向您的线程发送自定义信号.

所以,正如我需要这样的信号黑客,我可以让它更简单一点,只需backtrace在目标线程中执行的被叫信号处理程序中使用(这也是sandeep在这里建议).这基本上就是我的实现所做的.

如果您还对打印回溯感兴趣,即获取一些有用的调试信息(函数名称,源代码文件名,源代码行号等),请在此处阅读有关backtrace_symbols基于libbfd 的扩展.或者只是在这里看到来源.


san*_*eep 8

借助回溯信号处理可以解决您的目的.

我的意思是如果你有一个Thread的PID,你可以为该线程发出一个信号.在处理程序中,您可以使用回溯.因为处理程序将在该partucular线程中执行,所以backtrace将是输出所需的输出.