运行时出现计数器退出代码139,但通过gdb可以成功运行

24

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

我正在使用omnet++模拟无线网络。omnet++本身是一个C++程序。

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

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

有人能告诉我为什么运行失败但调试不失败吗?

非常感谢!


2
听起来像是未定义的行为。如果没有看到有问题的代码,我们无法提供帮助。 - Joseph Mansfield
2个回答

44

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

不是的,这意味着您的程序因信号11(SIGSEGV在Linux和大多数其他UNIX中)而崩溃,也称为"段错误"。

有人能告诉我为什么运行失败但调试可以成功吗?

您的程序表现出未定义行为,可能会做一些奇怪的事情(包括有时表现得正确)。

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

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


感谢您的迅速回复,我正在寻找如何在命令提示符中运行程序,现在被模拟器卡住了。分析完毕并使用 Valgrind 后我会回报情况。 - ulyssis2
现在我可以通过命令提示符运行和调试程序,运行和调试都跨越了“有问题的代码”,然后我再次使用Eclipse IDE,我发现在调试模式下,它停在了与使用命令提示符相同的位置,当我逐步运行程序时,它也会通过“有问题的代码”执行,但是当我运行它时,程序会在“有问题的代码”附近崩溃。我猜这是由于IDE,因为GUI本身也是一个程序,在正常运行模式下无法正常工作。我不知道为什么。 - ulyssis2
@ulyssis2 Valgrind 说了什么?程序在 IDE 外似乎可以工作,但 Valgrind 仍应告诉您有关错误的信息。 - Employed Russian
谢谢伙计。Valgrind确实有报告,但不是在“有问题的代码”上,在IDE中运行卡住的地方,Valgrind报告“分段错误(核心已转储)”,这发生在我的代码后半部分。那个bug与unordered map有关,我正在尝试为它启动一个新线程。 - ulyssis2

3

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

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

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

当我执行 *(char*)0 = 0; 时,程序会报错:分段错误。它不会只是静默地退出(139)。 - Goswin von Brederlow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接