微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我看到了其他线程的回溯,但没有包含很多实用信息。

我想要的是能够使用运行在Linux(CentOS,2.6内核)上的POSIX线程在Cmultithreading应用程序中捕获SIGSEGV,并打印导致它的线程的堆栈跟踪。 当然,不知道哪个线程导致了这个问题,对于我来说,这个主线程捕获了所有线程上的枚举信号,只是打印出所有线程的堆栈跟踪信息。

在那里注意到,也许libunwind可以用于这个,但是它的文档相当缺乏,我找不到一个很好的例子来说明如何使用它。 此外,我想知道是否有任何显着的性能开销或其他影响,是否经过战斗testing和用于生产代码,或者如果它大多只用于debugging和开发,而不是在生产系统。

有没有人有样品代码使用libunwind或另一个合理简单的(如不写在汇编)的方式来做到这一点?

传递一个指向exec()的进程的指针

分离的pthread导致内存泄漏

在linux中更改线程优先级和调度程序

SIGKILL init(PID = 1)没有sudo? 在Linux中的错误

用于反汇编C ++可执行文件的最好的Linux工具

libcurl和libsoup之间的区别

为什么Arduino Micro(USB设备)的供应商ID和产品ID在Linux和Windows中有所不同?

在Windows下dynamic加载的库的地址范围

epoll文件描述符操作

我可以从对话框的DoModal函数返回一个自定义值吗?

获得导致异常的线程的回溯很容易,或多或少:

将-rdynamic标志传递给链接

然后,在您的代码注册信号处理程序中,从信号处理程序参数中提取故障的EIP,然后使用它和backtrace()函数获取地址数组。

找到一些方法将数组中的数据传递到应用程序之外(例如,通过管道进行不同的处理以获取样本),然后可以使用backtrace_symbols()将回溯转换为符号名称

确保不要在信号处理程序中使用任何线程异步非安全函数,不要使用任何锁,分配内存或调用任何功能

以下是我在这主题上发表的幻灯片: http : //www.scribd.com/doc/3726406/Crash-N-Burn-Writing-Linux-application-fault-handlers

这个视频也可以在这个地方找到,但现在我找不到

扩展这个以获得多线程的回溯是可能的,但是相当棘手 – 您需要保持各个线程的标签,并在发生崩溃时向它们发送信号

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐