什么原因导致SIGABRT故障?

时间:2012-06-22 17:20:14

标签: c++

请问您能告诉我C ++中可能导致SIGABRT错误的原因吗?

3 个答案:

答案 0 :(得分:16)

Wikipedia

  当它调用SIGABRT中定义的abort libc函数时,进程会将

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

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

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

答案 1 :(得分:8)

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

答案 2 :(得分:5)

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

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

会导致SIGABRT