ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

我可以在多线程(pthreads)应用程序中捕获SIGSEGV和其他信号并打印导致它的线程或所有线程的回溯吗?

2019-12-08 04:00:40  阅读:662  来源: 互联网

标签:multithreading c-3 linux


我看到了Getting a backtrace of other thread,但其中没有很多实用信息.

我想要的是能够使用Linux(CentOS,2.6内核)上运行的POSIX线程在C多线程应用程序中捕获SIGSEGV,并打印导致它的线程的堆栈跟踪.当然,不知道是哪个线程引起的,对我来说是足够的(tm),捕获信号的主线程会枚举所有线程,并仅打印所有线程的堆栈跟踪.

在那里有人指出,也许可以使用libunwind进行此操作,但是却缺少它的文档,我找不到很好的例子说明如何为此目的使用它.另外,我想知道它是否对性能有重大影响或其他影响,是否经过了实战测试并在生产代码中使用,或者它是否仅在调试和开发中使用,而不在生产系统中使用.

是否有人使用libunwind或其他相当简单的方式(例如不以汇编形式编写)的示例代码来执行此操作?

解决方法:

或多或少地很容易地获得引起异常的线程的回溯:

将-rdynamic标志传递给链接器

然后,在您的代码寄存器信号处理程序中,从信号处理程序参数中提取故障的EIP,然后将其与backtrace()函数一起使用以获取地址数组.

找到某种方法将数据传递到应用程序外部(通过示例管道通过另一个进程),然后可以在其中使用backtrace_symbols()将backtrace转换为符号名称.

确保不要在信号处理程序中使用任何线程异步非安全函数,不要获取任何锁,分配内存或调用任何执行此操作的函数.

这是我对此主题进行演示的幻灯片:http://www.scribd.com/doc/3726406/Crash-N-Burn-Writing-Linux-application-fault-handlers

该视频也可以在演讲的某个地方找到,但现在找不到了…

扩展它以获取多个线程的回溯是可能的,但是非常棘手-您需要保留各种线程的选项卡,并在发生崩溃时向它们发送信号

标签:multithreading,c-3,linux
来源: https://codeday.me/bug/20191208/2088894.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有