web-dev-qa-db-ja.com

実行中はカウンター終了コード139を返しますが、gdbはそれを実行します

私の質問は具体的に聞こえますが、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

実行が失敗するがデバッグは失敗しない理由を誰かに教えてもらえますか?

どうもありがとう!

15
ulyssis2

終了コード139(これはメモリの断片化を意味すると言われています)

いいえ、それはあなたのプログラムがシグナル11(Linuxおよび他のほとんどのUNIXではSIGSEGV)で死んだことを意味します。これはsegmentation faultとしても知られています。

実行が失敗するがデバッグは失敗しない理由を誰かに教えてもらえますか?

あなたのプログラムは未定義の振る舞いを示し、anythingを実行できます(これは時々正しく動作するように見えることを含みます)。

firstステップでValgrindの下でこのプログラムを実行し、報告されたすべてのエラーを修正する必要があります。

上記を実行してもプログラムがクラッシュする場合は、コアダンプ(ulimit -c unlimited; ./a.out)してから、GDBでそのコアダンプを分析する必要があります:gdb ./a.out core;その後、whereコマンドを使用します。

29

このエラーは、ヌルポインター参照によっても発生します。初期化されていないポインタを使用している場合、このエラーが発生します。

ポインターが初期化されているかどうかを確認するには、次のようなものを試すことができます

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