質問

C ++プログラムをgdbで実行しています。私はgdbを実際に使用したことはありませんが、次のようなメッセージが表示されます:

warning: HEAP[test.exe]:
warning: Heap block at 064EA560 modified at 064EA569 past requested size of 1

これが発生している場所を追跡するにはどうすればよいですか?メモリを表示しても、手がかりが得られません。

ありがとう!

役に立ちましたか?

解決

つまり、ヒープを破壊しています。以下は、 GDBチュートリアルです。心。

私の通常のプラクティスは、コードの既知の良い部分にブレークを設定することです。エラーが発生するまで、そこに到達します。通常、問題をそのように判断できます。

ヒープエラーが発生しているので、ヒープに置くものと関係があると思いますので、変数に特に注意してください(GDBでprintを使用して、メモリアドレスとエラーが発生した場所と同期できる場合があります)。また、関数の入力と関数からの戻りはヒープで再生されるため、問題が発生する可能性があります(特に、関数から戻る前にヒープを台無しにした場合)。

他のヒント

「ウォッチポイント」と呼ばれる機能を使用できます。これはブレークポイントのようなものですが、メモリが変更されるとデバッガーが停止します。

回答でこれを使用する方法について大まかなアイデアを示しました別の質問へ。

他のツールを使用できる場合は、 Valgrind を試すことを強くお勧めします。これは、通常はエラーの原因となる正確な命令で停止できるようにコードを実行できるインストルメンテーションフレームワークです。ヒープエラーは通常、この方法で簡単に見つけることができます。

MALLOC_CHECK_環境変数が設定された標準のlibc(man libc)と同じようなものであるため、試してみてください。

gdbを終了しない場合(アプリケーションが終了した場合は、「r」を使用して再実行します)、そのアドレスにメモリブレークポイントを設定し、「hbreak 0x64EA569」、「help hbreak」も使用できます;条件またはその他のbreakpoitnの有効化/無効化オプションを設定して、そのブレークポイントに過度に入らないようにします。...

ログファイルを設定し、ログを設定するだけです...ブレークごとにスタックトレースを設定し、「display / bt -4」を入力してからrを押し、Enterキーを押したままスクロールさせます "またはc ##を使用してx回...などを続けてください。&quot ;、最終的には同じアサーションが表示され、(display / btにより)スタックトレースが得られます。そのアドレスを変更していました...

構造体へのポインターの配列を再割り当てしようとしたときに同様の問題がありましたが、代わりにintの配列として再割り当てしていました(チュートリアルからコードを取得し、変更するのを忘れていたため)。コンパイラは、サイズ引数の内容を確認できないため、私を修正しませんでした。 私の変数は:

itemsetList_t ** iteration_isets;

つまり、reallocでは次のようになります:

iteration_isets = realloc(iteration_isets、sizeof(itemsetList_t *)* max_elem);

持っていたもの:

iteration_isets = realloc(iteration_isets、sizeof(int)* max_elem);

そして、これは私のヒープの問題を引き起こしました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top