获得其他线程的回溯

时间:2011-06-19 11:45:11

标签: linux multithreading backtrace

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

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

还有其他想法吗? 感谢。

3 个答案:

答案 0 :(得分:10)

我自己实现了here

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

但是,要保证安全(并且上面的源不是,甚至可能会被破坏),您必须在访问其堆栈时挂起该线程。我四处寻找暂停线程的不同方法,找到了thisthisthis。基本上,没有什么好办法。常见的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为调试多线程程序提供了这些功能:

  • 自动通知新线程
  • 'thread thread-id',一个在线程之间切换的命令
  • 'info threads',查询现有线程的命令
  • 'thread apply [thread-id-list] [all] args',一个将命令应用于线程列表的命令
  • 特定于线程的断点
  • 'set print thread-events',它控制线程开始和退出时的消息打印。
  • 'set libthread-db-search-path path',允许用户指定默认选项与程序不兼容时使用的libthread_db。

所以只需通过cmd转到GDB中所需的线程:'thread thread-id'。 然后在该线程上下文中执行'bt'以打印线程回溯。