你能告诉我什么可能导致 C++ 中的 SIGABRT 错误吗?
3 回答
根据维基百科,
SIGABRT
由进程在调用abort
libc 函数时发送给它自己,定义在stdlib.h
. 信号可以被捕获,SIGABRT
但不能被阻塞;如果信号处理程序返回,则所有打开的流都将关闭并刷新,程序终止(如果合适,转储核心)。这意味着abort
调用永远不会返回。由于这个特性,它经常被用来表示支持库中的致命情况,即当前操作无法完成但主程序可以在退出前执行清理的情况。它在断言失败时使用。
这意味着如果您的代码没有abort
直接调用,也没有通过 向自身发送SIGABRT
信号raise
,并且您没有任何失败的断言,那么原因一定是支持库(可能是 libc)遇到了内部错误。如果您提供程序的详细信息,我们可能会提出可能的原因。更好的是,如果您检查内核或在调试器中运行程序,您应该能够收集堆栈跟踪,这将显示哪个库导致您的程序中止。
(也有可能您系统上的另一个程序正在发送您的程序SIGABRT
,但在大多数情况下,这几乎是不可能的。)
这通常发生在库遇到内部错误时,因此它们调用 abort(),因为它们无法继续。当您覆盖其中一种数据结构(例如,属于 libc 中的函数的数据结构)时,可能会发生这种情况。所以这可能是例如 libc 调用,因为您确实覆盖了某些内容。然后应用程序必须终止,因为无法继续或处理它,这称为失败断言。
在实践中,这通常由 assert 宏触发:
char* foo = NULL;
assert( foo != NULL );
会导致 SIGABRT