运行时计数器退出代码139,但gdb完成

时间:2013-03-24 15:25:18

标签: c++ gdb segmentation-fault undefined-behavior

我的问题听起来很具体,但我怀疑它仍然可能是C ++调试问题。

我正在使用omnet ++来模拟无线网络。 omn​​et ++本身就是一个c ++程序。

当我运行我的程序时遇到了一个奇怪的现象(在Ubuntu 12.04中使用omnet ++ 4.2.2修改了inet框架):当触摸代码的某一部分时,程序退出,退出代码为139(人们说这意味着内存碎片)当我尝试调试时,gdb没有报告模拟退出的“有问题”代码有什么问题,实际上,调试会通过这部分代码并输出预期结果。

gdb版本信息:GNU gdb(Ubuntu / Linaro 7.4-2012.04-0ubuntu2.1)7.4-2012.04

有人可以告诉我为什么运行失败但调试没有?

非常感谢!

2 个答案:

答案 0 :(得分:26)

  

退出代码139(人们说这意味着内存碎片化)

不,这意味着您的程序在信号11(Linux上的SIGSEGV和大多数其他UNIX)上死亡,也称为segmentation fault

  

有人可以告诉我为什么运行失败但调试没有?

您的程序显示未定义的行为,并且可以执行任何(包括有时可能正常工作)。

您的第一个步骤应该在Valgrind下运行此程序,并修复它报告的所有错误。

如果在执行上述操作后,程序仍然崩溃,那么您应该让它转储核心(ulimit -c unlimited; ./a.out),然后使用GDB分析该核心转储:gdb ./a.out core;然后使用where命令。

答案 1 :(得分:0)

此错误也是由空指针引用引起的。 如果您使用的指针未初始化,则会导致此错误。

要检查指针是否已初始化,可以尝试类似

Class *pointer = new Class();
if(pointer!=nullptr){
    pointer->myFunction();
}