23

我的问题听起来很具体,但我怀疑它仍然可能是 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

谁能告诉我为什么运行失败但调试没有?

非常感谢!

4

2 回答 2

44

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

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

谁能告诉我为什么运行失败但调试没有?

您的程序表现出未定义的行为,并且可以做任何事情(包括有时看起来可以正常工作)。

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

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

于 2013-03-24T16:00:36.667 回答
2

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

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

Class *pointer = new Class();
if(pointer!=nullptr){
    pointer->myFunction();
}
于 2019-07-02T15:36:07.660 回答