在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”以打印线索回溯。
总结以上是内存溢出为你收集整理的获取其他线程的回溯全部内容,希望文章能够帮你解决获取其他线程的回溯所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)