请问您能告诉我C ++中可能导致SIGABRT错误的原因吗?
答案 0 :(得分:16)
当它调用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