我看到了其他线程的回溯,但没有包含很多实用信息。
我想要的是能够使用运行在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文件描述符操作
获得导致异常的线程的回溯很容易,或多或少:
将-rdynamic标志传递给链接器
然后,在您的代码注册信号处理程序中,从信号处理程序参数中提取故障的EIP,然后使用它和backtrace()函数获取地址数组。
找到一些方法将数组中的数据传递到应用程序之外(例如,通过管道进行不同的处理以获取样本),然后可以使用backtrace_symbols()将回溯转换为符号名称。
确保不要在信号处理程序中使用任何线程异步非安全函数,不要使用任何锁,分配内存或调用任何功能。
以下是我在这个主题上发表的幻灯片: http : //www.scribd.com/doc/3726406/Crash-N-Burn-Writing-Linux-application-fault-handlers
这个视频也可以在这个地方找到,但现在我找不到
扩展这个以获得多线程的回溯是可能的,但是相当棘手 – 您需要保持各个线程的标签,并在发生崩溃时向它们发送信号
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。