中止信号的一般原因是啥?
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的晶振,有哪位知道为啥会用到这个大小的晶振?具体作用是啥