2011-04-20 61 views
5

我有一个应用程序,在C++上运行的Linux,在出口获取中止信号。 在追踪代码来追究问题之前,我需要知道可能会发生什么情况,以便从内核中获取中止信号。这可以给我正确的调试方向。中止信号的一般原因是什么?

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

@执行情形的细节是,

  • 过程是在退出模式,即出口()例程被调用过程的正常关机。
  • 因此调用所有全局对象析构函数。

TIA

+1

你一定要明白,在gdb运行你的应用程序将让你看到确切的所在行中止被调用,并给你一个调用堆栈 – radman 2011-04-20 04:59:41

+0

我有几次与gdb运行,​​但问题是,一旦进程中止信号它是从gdb分离。所以堆栈跟踪不可用。 – Mandar 2011-04-20 06:56:14

回答

3
  • 与调试器-g
  • 运行它编译

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

其他解决方案:

  • 改变你的核心转储代与ulimit
  • 负载核心转储在gdb验尸

根本原因可能是多方面的:通过阅读0的内存空间,划分之外,取消引用无效指针...

+0

我试过,但无法获得堆栈跟踪。这个过程在中止时,si简单地从gdb中分离出来。 – Mandar 2011-04-20 05:29:32

0

我会尝试在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 
相关问题