我的问题听起来很具体,但我怀疑它仍然可能是C ++调试问题。
我正在使用omnet ++来模拟无线网络。 omnet ++本身就是一个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
有人可以告诉我为什么运行失败但调试没有?
非常感谢!
答案 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();
}