如何在多线程环境中捕获 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 和可能的其他信号,以防止我的进程被杀死

这是徒劳的练习。在引发SIGABRTSIGSEGV 之后,您(通常)不知道进程的状态——它可能损坏了测试框架内部的堆、堆栈、全局数据, C 运行时系统内部的全局数据等。继续这样的过程极有可能在代码中的随机(正确)位置继续崩溃。

唯一在测试框架中处理此问题的合理方法是 fork 并让 进程处理子错误退出,报告它们并继续运行其他测试.

SIGABRT 是线程直接信号?

没有“直接信号”这样的东西。 SIGABRT可以从外部发送到进程,也可以在进程内部发送raised。

如果我只使用主线程来捕获 SIGABRT(或 SIGSEGV)信号会怎样?

SIGSEGVSIGABRT(当不是从外部发送时)被发送到导致无效内存操作的线程(或raised 它)。

此外,没有办法“只使用主线程”——sigaction 在所有线程中都是全局的(尽管您可以设置线程特定的信号掩码)。

【讨论】:

以上是关于如何在多线程环境中捕获 SIGABRT?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 在多线程环境中测试某些东西 [重复]

如何保护可能在多线程或异步环境中使用的资源?

线程 1 信号 SIGABRT 以 NSException 类型的未捕获异常终止

如何在多线程环境中使用嵌入式 MySQL?

如何在多线程环境中只执行一次代码块?

Spring在多线程环境下如何确保事务一致性