2013-03-24 38 views
6

我的問題聽起來很具體,但我懷疑它仍然可能是C++調試問題。運行時計數器退出代碼139,但gdb通過

我使用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

聽起來像未定義的行爲。沒有看到有問題的代碼,我們無法幫助。 – 2013-03-24 15:26:08

回答

17

退出代碼139(有人說這意味着內存碎片)

不,這意味着你的程序有(在Linux SIGSEGV和大多數其他UNIX系統)信號11死了,也被稱爲segmentation fault

有人能告訴我爲什麼運行失敗,但調試沒有?

你的程序表現出不確定的行爲,並且可以做任何事情(即包括出現有時正常工作)。

您的第一個步驟應該在Valgrind下運行此程序,並修復它報告的所有錯誤。

如果在完成上述操作後,程序仍然崩潰,那麼您應該讓它轉儲核心(ulimit -c unlimited; ./a.out),然後使用GDB分析該核心轉儲:gdb ./a.out core;然後使用where命令。

+0

感謝您的快速回復,我正在尋找如何在命令提示符下運行程序,我現在被模擬器卡住了。我會在用valgrind分析後再報告。 – ulyssis2 2013-03-24 21:09:21

+0

現在我可以通過命令提示符運行和調試程序,運行和調試都跨越「有問題的代碼」,然後再次使用eclipse IDE,我發現在調試模式下,它使用命令提示符停止在相同的地方,當我一步步運行程序時,它也通過「有問題的代碼」執行,但是當我運行它時,程序會在「有問題的代碼」周圍的某處崩潰。我想這是由於IDE,因爲GUI本身也是一個程序,並且在正常運行模式下無法正常工作。我不知道爲什麼。 – ulyssis2 2013-03-25 19:44:46

+0

@ ulyssis2 Valgrind說什麼?該程序似乎可以在IDE之外工作,但Valgrind仍應該告訴您有關錯誤的信息。 – 2013-03-25 21:11:40

相關問題