gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:10:59 24 4
gpt4 key购买 nike

我看到了Getting a backtrace of other thread但它没有包含很多实用信息。

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

有人指出,也许 libunwind可以用于此目的,但它的文档相当缺乏,我找不到一个很好的例子来说明如何将它用于此目的。另外,我想知道它是否有任何显着的性能开销或其他影响,它是否经过实战测试并用于生产代码,或者它是否主要仅用于调试和开发,而不用于生产系统。

有没有人有使用 libunwind 或其他相当简单(比如不在汇编中编写)的示例代码来执行此操作?

最佳答案

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

将 -rdynamic 标志传递给链接器

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

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

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

以下是我就该主题所做的演示文稿的幻灯片:http://www.scribd.com/doc/3726406/Crash-N-Burn-Writing-Linux-application-fault-handlers

视频也可以在演讲的某个地方找到,但我现在找不到...

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

关于我可以在多线程(pthreads)应用程序中捕获 SIGSEGV 和其他信号并打印导致它的线程或所有线程的回溯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6923041/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com