获取其他线程的回溯

获取其他线程的回溯,第1张

概述获取其他线程回溯

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

看来,@R_737_4035@(http://www.nongnu.org/@R_737_4035@/)项目可以提供帮助。 问题是CentOS不支持它,所以我不喜欢使用它。

任何其他的想法? 谢谢。

一个程序能读取自己的精灵部分吗?

从catch块获取回溯

函数调用在_start之前和主要在回溯

在共享库内的回溯函数

如何从崩溃中提取deBUGging信息

gdb:如何获得完整的回溯当fglrx_dri.so segfaults?

在linux上可以使用backtrace()来替代静态函数的符号

ARM平台上的SIGABRT信号没有回溯?

问号是什么意思? 在linux内核恐慌调用跟踪?

使用malloc / free on callstack从Signal Handler回溯linux 64位

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

我的意思是如果你有一个线程的PID,你可以为该线程发出一个信号。 在处理程序中你可以使用回溯。 因为处理程序会在那个特殊的线程中执行,所以回溯将会是你所需要的输出。

我自己在这里实现了 。

最初,我想实现类似的建议这里 ,即得到某种方式的顶级框架指针的线程和展开它手动(链接的源派生从苹果backtrace实现,因此可能是苹果专用的,但这个想法是通用的) 。

但是,为了安全起见(上面的源代码不是,甚至可能会被破坏),在访问堆栈时必须暂停该线程。 我搜索了不同的方式来暂停一个线程,发现这个 , 这个和这个 。 基本上,没有什么好的方法。 Hotspot JAVA虚拟机使用的常见黑客技术是使用信号并通过pthread_kill向您的线程发送自定义信号。

因此,无论如何我都需要这样的信号破解,我可以让它更简单一点,只需要在目标线程中执行的被调用的信号处理程序中使用backtrace (正如sandeep所建议的那样 )。 这基本上是我的实现正在做的。

如果你也有兴趣打印回溯,也就是获得一些有用的调试信息(函数名称,源代码文件名,源代码行号…),请阅读这里了解基于libbfd的扩展backtrace_symbols 。 或者只是看到这里的来源。

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”以打印线索回溯。

总结

以上是内存溢出为你收集整理的获取其他线程的回溯全部内容,希望文章能够帮你解决获取其他线程的回溯所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1282844.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存