我看到了其他线程的回溯,但没有包含很多实用信息。
我想要的是能够使用运行在Linux(CentOS,2.6内核)上的POSIX线程在Cmultithreading应用程序中捕获SIGSEGV,并打印导致它的线程的堆栈跟踪。 当然,不知道哪个线程导致了这个问题,对于我来说,这个主线程捕获了所有线程上的枚举信号,只是打印出所有线程的堆栈跟踪信息。
在那里注意到,也许libunwind可以用于这个,但是它的文档相当缺乏,我找不到一个很好的例子来说明如何使用它。 此外,我想知道是否有任何显着的性能开销或其他影响,是否经过战斗testing和用于生产代码,或者如果它大多只用于debugging和开发,而不是在生产系统。
有没有人有样品代码使用libunwind或另一个合理简单的(如不写在汇编)的方式来做到这一点?
获得导致异常的线程的回溯很容易,或多或少:
将-rdynamic标志传递给链接器
然后,在您的代码注册信号处理程序中,从信号处理程序参数中提取故障的EIP,然后使用它和backtrace()函数获取地址数组。
找到一些方法将数组中的数据传递到应用程序之外(例如,通过管道进行不同的处理以获取样本),然后可以使用backtrace_symbols()将回溯转换为符号名称。
确保不要在信号处理程序中使用任何线程异步非安全函数,不要使用任何锁,分配内存或调用任何功能。
以下是我在这个主题上发表的幻灯片: http : //www.scribd.com/doc/3726406/Crash-N-Burn-Writing-Linux-application-fault-handlers
这个视频也可以在这个地方找到,但现在我找不到
扩展这个以获得多线程的回溯是可能的,但是相当棘手 – 您需要保持各个线程的标签,并在发生崩溃时向它们发送信号