42

你能告诉我什么可能导致 C++ 中的 SIGABRT 错误吗?

4

3 回答 3

26

根据维基百科

SIGABRT由进程在调用abortlibc 函数时发送给它自己,定义在stdlib.h. 信号可以被捕获,SIGABRT但不能被阻塞;如果信号处理程序返回,则所有打开的流都将关闭并刷新,程序终止(如果合适,转储核心)。这意味着abort调用永远不会返回。由于这个特性,它经常被用来表示支持库中的致命情况,即当前操作无法完成但主程序可以在退出前执行清理的情况。它在断言失败时使用。

这意味着如果您的代码没有abort直接调用,也没有通过 向自身发送SIGABRT信号raise,并且您没有任何失败的断言,那么原因一定是支持库(可能是 libc)遇到了内部错误。如果您提供程序的详细信息,我们可能会提出可能的原因。更好的是,如果您检查内核或在调试器中运行程序,您应该能够收集堆栈跟踪,这将显示哪个库导致您的程序中止。

(也有可能您系统上的另一个程序正在发送您的程序SIGABRT,但在大多数情况下,这几乎是不可能的。)

于 2012-06-24T22:32:46.313 回答
10

这通常发生在库遇到内部错误时,因此它们调用 abort(),因为它们无法继续。当您覆盖其中一种数据结构(例如,属于 libc 中的函数的数据结构)时,可能会发生这种情况。所以这可能是例如 libc 调用,因为您确实覆盖了某些内容。然后应用程序必须终止,因为无法继续或处理它,这称为失败断言。

于 2012-06-22T17:31:46.170 回答
6

在实践中,这通常由 assert 宏触发:

char* foo = NULL;
assert( foo != NULL );

会导致 SIGABRT

于 2012-06-24T22:39:47.220 回答