【问题标题】:Counter exit code 139 when running, but gdb make it through运行时计数器退出代码 139,但 gdb 使其通过
【发布时间】:2013-03-14 01:51:57
【问题描述】:

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

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

非常感谢!

【问题讨论】:

  • 听起来像是未定义的行为。如果没有看到有问题的代码,我们就忍不住了。

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 感谢您的快速回复,我正在寻找如何在命令提示符下运行程序,我现在被模拟器卡住了。我会在用 valgrind 分析后报告。
  • 现在我可以通过命令提示符运行和调试程序,运行和调试跨越“有问题的代码”,然后我再次使用 Eclipse IDE,我发现在调试模式下,它停在与使用命令提示符相同的地方,当我逐步运行程序时,它也会通过“有问题的代码”执行,但是当我运行它时,程序会在“有问题的代码”周围的某处崩溃。我猜这是IDE的原因,因为GUI本身也是一个程序,在正常运行模式下无法正常工作。我不知道为什么。
  • @ulyssis2 Valgrind 怎么说?该程序可能看起来可以在 IDE 之外运行,但 Valgrind 仍然应该告诉您您的错误。
  • 谢谢哥们。 valgrind 确实报告,但没有报告“运行”IDE 卡住的“有问题的代码”,valgrind 报告“分段错误(核心转储)”,这发生在我的代码的后半部分。该错误与无序地图有关,我正在尝试为此启动一个新线程。
【解决方案2】:

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

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

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

【讨论】:

  • 当我执行*(char*)0 = 0; 时,程序说:分段错误。它不只是默默地退出(139)。
猜你喜欢
  • 2019-08-25
  • 2021-03-07
  • 1970-01-01
  • 2022-07-05
  • 2017-12-14
  • 2018-07-22
  • 1970-01-01
  • 2019-04-07
  • 2016-09-13
相关资源
最近更新 更多