如何在多线程环境中捕获 SIGABRT?
How to catch SIGABRT in multithread environment?
我想创建一个单元测试框架,但为了提供良好的报告,我需要捕获 SIGABRT、SIGSEGV 和可能的其他信号以防止我的进程被终止(因此,能够继续测试处理)...
但我不知道该怎么做,所以我需要信息:
- SIGABRT 是线程直接信号吗?
- 如果我只使用主线程来捕获 SIGABRT(或 SIGSEGV)信号会怎样?调用 abort return 的线程能否从它的调用中退出(我希望不会)?
如果您有任何有用的文档、链接或教程,我很感兴趣。它适用于使用 pthreads 的 C 代码。
感谢您的帮助
I need to catch SIGABRT, SIGSEGV and probably others signals to prevent my process from being killed
这是徒劳的。在引发 SIGABRT
或 SIGSEGV
之后,您(通常) 不知道 进程的状态——它可能损坏了堆、堆栈、全局测试框架内部的数据,C 运行时系统内部的全局数据,等等。继续这样的过程极有可能继续在代码中随机(正确)的地方崩溃。
只有在测试框架中处理这个问题的明智方法是fork
并让父进程处理子进程错误存在,报告它们并继续 运行 额外的测试。
SIGABRT is a thread direct signal ?
没有“直接信号”这样的东西。 SIGABRT
可能是从进程外发给进程,也可能是进程内部raise
d。
What happens if I only use the main thread to catch the SIGABRT (or SIGSEGV) signal?
SIGSEGV
和 SIGABRT
(当不是从外部发送时)被发送到导致无效内存操作的线程(或 raise
d 它)。
此外,没有办法“仅使用主线程”——sigaction
在所有线程中是全局的(尽管您可以设置线程特定的信号掩码)。
我想创建一个单元测试框架,但为了提供良好的报告,我需要捕获 SIGABRT、SIGSEGV 和可能的其他信号以防止我的进程被终止(因此,能够继续测试处理)...
但我不知道该怎么做,所以我需要信息:
- SIGABRT 是线程直接信号吗?
- 如果我只使用主线程来捕获 SIGABRT(或 SIGSEGV)信号会怎样?调用 abort return 的线程能否从它的调用中退出(我希望不会)?
如果您有任何有用的文档、链接或教程,我很感兴趣。它适用于使用 pthreads 的 C 代码。
感谢您的帮助
I need to catch SIGABRT, SIGSEGV and probably others signals to prevent my process from being killed
这是徒劳的。在引发 SIGABRT
或 SIGSEGV
之后,您(通常) 不知道 进程的状态——它可能损坏了堆、堆栈、全局测试框架内部的数据,C 运行时系统内部的全局数据,等等。继续这样的过程极有可能继续在代码中随机(正确)的地方崩溃。
只有在测试框架中处理这个问题的明智方法是fork
并让父进程处理子进程错误存在,报告它们并继续 运行 额外的测试。
SIGABRT is a thread direct signal ?
没有“直接信号”这样的东西。 SIGABRT
可能是从进程外发给进程,也可能是进程内部raise
d。
What happens if I only use the main thread to catch the SIGABRT (or SIGSEGV) signal?
SIGSEGV
和 SIGABRT
(当不是从外部发送时)被发送到导致无效内存操作的线程(或 raise
d 它)。
此外,没有办法“仅使用主线程”——sigaction
在所有线程中是全局的(尽管您可以设置线程特定的信号掩码)。