gdb で C++ プログラムを実行しています。私は gdb の経験はあまりありませんが、次のようなメッセージが表示されます。
warning: HEAP[test.exe]:
warning: Heap block at 064EA560 modified at 064EA569 past requested size of 1
これがどこで起こっているかを追跡するにはどうすればよいですか? メモリを表示しても、何の手がかりも得られません。
ありがとう!
だからあなたはあなたのヒープを破壊しています。覚えておくと便利なGDB チュートリアルを次に示します。
私の通常のやり方は、コードの既知の適切な部分にブレークを設定することです。そこに到達したら、エラーになるまでステップスルーします。通常、その方法で問題を特定できます。
ヒープエラーが発生しているため、ヒープに配置しているものに関係していると思われるため、変数に特に注意してください(GDBでprintを使用してメモリアドレスを特定できると思います。エラーが発生した場所と同期します)。また、関数への入力と関数からの戻りはヒープで行われるため、問題が発生している可能性があることも覚えておく必要があります (特に、関数から戻る前にヒープを台無しにした場合)。
おそらく「ウォッチポイント」と呼ばれる機能を使用できます。これはブレークポイントのようなものですが、メモリが変更されるとデバッガは停止します。
別の質問への回答でこれをどのように使用するかについて大まかなアイデアを出しました。
他のツールを使用できる場合は、Valgrindを試してみることを強くお勧めします。これはインストルメンテーションフレームワークであり、通常、エラーの原因となった正確な命令で停止できるようにコードを実行できます。ヒープエラーは通常、この方法で簡単に見つけることができます。
ポインターの配列を構造体に再割り当てしようとしたときに同様の問題が発生しましたが、代わりに int の配列として再割り当てしていました (チュートリアルからコードを取得し、それを変更するのを忘れたため)。サイズ引数の内容を確認できないため、コンパイラは私を修正していませんでした。私の変数は次のとおりです。
itemsetList_t ** iteration_isets;
したがって、次の代わりに再割り当てします。
iteration_isets = realloc(iteration_isets, sizeof(itemsetList_t *) * max_elem);
私が持っていた:
iteration_isets = realloc(iteration_isets, sizeof(int) * max_elem);
そして、これが私のヒープの問題を引き起こしました。