如何在多线程环境中捕获 SIGABRT?
Posted
技术标签:
【中文标题】如何在多线程环境中捕获 SIGABRT?【英文标题】:How to catch SIGABRT in multithread environment? 【发布时间】:2022-01-16 01:54:51 【问题描述】:我想创建一个单元测试框架,但为了提供良好的报告,我需要捕获 SIGABRT、SIGSEGV 和可能的其他信号,以防止我的进程被杀死(因此,能够继续测试处理)。 ..
但我不知道该怎么做,所以我需要信息:
SIGABRT 是线程直接信号? 如果我只使用主线程来捕获 SIGABRT(或 SIGSEGV)信号会怎样?调用 abort 的线程能否从其调用中返回(我希望不会)?如果您有任何有用的文档、链接或教程,我很感兴趣。它适用于使用 pthreads 的 C 代码。
感谢您的帮助
【问题讨论】:
【参考方案1】:我需要捕捉 SIGABRT、SIGSEGV 和可能的其他信号,以防止我的进程被杀死
这是徒劳的练习。在引发SIGABRT
或SIGSEGV
之后,您(通常)不知道进程的状态——它可能损坏了测试框架内部的堆、堆栈、全局数据, C 运行时系统内部的全局数据等。继续这样的过程极有可能在代码中的随机(正确)位置继续崩溃。
唯一在测试框架中处理此问题的合理方法是 fork
并让 父 进程处理子错误退出,报告它们并继续运行其他测试.
SIGABRT 是线程直接信号?
没有“直接信号”这样的东西。 SIGABRT
可以从外部发送到进程,也可以在进程内部发送raise
d。
如果我只使用主线程来捕获 SIGABRT(或 SIGSEGV)信号会怎样?
SIGSEGV
和SIGABRT
(当不是从外部发送时)被发送到导致无效内存操作的线程(或raise
d 它)。
此外,没有办法“只使用主线程”——sigaction
在所有线程中都是全局的(尽管您可以设置线程特定的信号掩码)。
【讨论】:
以上是关于如何在多线程环境中捕获 SIGABRT?的主要内容,如果未能解决你的问题,请参考以下文章