中止信号的一般原因是啥?

Posted

技术标签:

【中文标题】中止信号的一般原因是啥?【英文标题】:What are the general causes of abort signal?中止信号的一般原因是什么? 【发布时间】:2011-04-20 04:52:14 【问题描述】:

我有一个应用程序,在 C++ 中运行 linux,它在退出时会收到中止信号。 在我去寻找代码来寻找问题之前,我需要知道在什么情况下我会从内核中得到一个中止信号。这可以给我正确的调试方向。

请提及应用程序可能会收到中止信号的每一种潜在情况。

@执行场景的细节是,

进程处于退出模式,即调用 exit() 例程以正常关闭进程。 因此会调用所有全局对象析构函数。

TIA

【问题讨论】:

您确实意识到在 gdb 中运行您的应用程序将允许您查看调用 abort 的确切行并为您提供调用堆栈 我很少使用 gdb 运行,但问题是,一旦进程收到中止信号,它就会与 gdb 分离。所以堆栈跟踪不可用。 【参考方案1】: 用 -g 编译 从调试器运行它

当应用程序崩溃时,调试器会给你一行,让你检查线程、变量...

其他解决方案:

使用ulimit 更改您的核心转储生成 在 gdb 事后加载核心转储

根本原因可能有多种:读取内存空间之外、除以 0、取消引用无效指针...

【讨论】:

我已经尝试过了,但无法获取堆栈跟踪。该进程在中止后,简单地与 gdb 分离。【参考方案2】:

我会尝试在valgrind 下运行。甚至在 abort 和 valgrind 注意到并告诉你之前就可能出现内存错误。如果是这种情况,您会发现错误比使用 gdb 之类的传统调试器容易得多。

【讨论】:

【参考方案3】:

中止的原因通常是断言失败

例如

(gdb) bt
#0  0x00000035fbc30265 in raise () from /lib64/libc.so.6
#1  0x00000035fbc31d10 in abort () from /lib64/libc.so.6
#2  0x00000035fbc296e6 in __assert_fail () from /lib64/libc.so.6

【讨论】:

以上是关于中止信号的一般原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

电脑连接投影仪闪烁是啥原因

视频信号处理电路一般都会用到27M的晶振,有哪位知道为啥会用到这个大小的晶振?具体作用是啥

当我尝试在 C++ 中编译和运行我的“main.cpp”文件时,导致调用中止方法的原因是啥?

投影仪总是闪是啥原因

域名转移失败一般是啥原因?

如何修复 dyld:库未加载... 原因:找不到图像 中止陷阱:6?