终止信号的一般原因是什么?

6
我有一个应用程序,在运行Linux的C++上,在退出时会收到中止信号。 在我开始查找问题之前,我需要知道什么情况下我会从内核收到中止信号。这可以让我正确地调试。
请列出每个可能导致应用程序收到中止信号的潜在场景。
具体执行场景如下:
  • 进程处于退出模式,即为了优雅地关闭进程而调用了exit()例程。
  • 因此,所有全局对象析构函数都被调用。
谢谢。

1
你应该意识到,在gdb中运行你的应用程序将允许你看到调用abort的确切行,并给出一个调用堆栈。 - radman
我使用了几次gdb,但问题是,一旦进程接收到中止信号,它就会从gdb中分离出来。因此,堆栈跟踪不可用。 - Mandar
3个回答

3
  • 使用-g参数进行编译
  • 从调试器中运行

当应用程序崩溃时,调试器将给出您所在的代码行,让您检查线程、变量等信息...

其他解决方案:

  • 使用ulimit更改核心转储生成
  • 在后期通过gdb加载核心转储文件进行分析

根本原因可能有多个:读取超出内存空间、除以0、无效指针解引用等。


我尝试过了,但是没有得到堆栈跟踪信息。在收到abort信号后,进程会被简单地从gdb中分离。 - Mandar

1

我建议你尝试在valgrind下运行程序。可能在程序崩溃之前就已经出现了内存错误,而这时候valgrind可以及时发现并提示你。如果是这种情况,使用valgrind比传统的调试器(如gdb)会更容易找到错误。


0

通常导致程序中止的原因是断言失败

例如

(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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接