[解決済み] ヒープ破壊エラーのデバッグ方法を教えてください。
質問
Visual Studio 2008で(ネイティブ)マルチスレッドC++アプリケーションをデバッグしています。不定期に「Windows has triggered a break point..." error」と表示され、ヒープの破壊が原因である可能性があると指摘されます。これらのエラーは、すぐにアプリケーションをクラッシュさせるわけではありませんが、直後にクラッシュする可能性があります。
これらのエラーの大きな問題は、破損が実際に発生した後にポップアップ表示されることで、特にマルチスレッドのアプリケーションでは、追跡やデバッグが非常に困難になります。
-
どのようなことが原因でこのようなエラーが発生するのでしょうか?
-
デバッグの方法を教えてください。
ヒント、ツール、メソッド、啓蒙...大歓迎です。
解決方法は?
アプリケーションベリファイア と合わせて Windows用デバッギングツール は素晴らしいセットアップです。 の一部として両方を手に入れることができます。 Windowsドライバキットまたは軽量なWindows SDK . (アプリケーションベリファイアーのことは ヒープ破壊の問題についての以前の質問 .) 過去にBoundsCheckerやInsure++(他の回答で紹介)も使ったことがありますが、Application Verifierにこれだけの機能があることに驚きました。
電気柵(別名:"efence")です。 dmalloc , バルグラインド などは言及する価値がありますが、これらのほとんどはWindowsよりも*nixで実行するのがはるかに簡単です。 Valgrind はとんでもなく柔軟です。私はこれを使って、多くのヒープ問題を抱えた大規模なサーバソフトウェアをデバッグしてきました。
他のすべてが失敗したとき、あなたは独自のグローバルな演算子new/deleteとmalloc/calloc/reallocオーバーロードを提供することができます - そうする方法は、コンパイラとプラットフォームによって少し異なります - そしてこれは少し投資になるでしょう - しかしそれは長い目で見れば報われるかもしれません。 望ましい機能のリストはdmallocやelectricfenceでおなじみで、驚くほど優れた本である 確かなコードの書き方 :
- セントリーバリュー マジックナンバーで埋める (バッファオーバーフローやアンダーフロー、たまに "wild" ポインタを捕捉するのに役立つ)。
- アロックフィル Visual C++は、デバッグビルドで既にこの処理を行います (初期化されていないバーの使用を検出するのに役立ちます)
- フリーフィル ほとんどの場合、デリファレンスされるとセグメンテーションフォールトを引き起こすように設計されています (ぶら下がりポインタの検出に役立ちます)。
- ディレイフリー 解放されたメモリをしばらくヒープに戻さず、空き領域は確保するが利用できないようにする (ダングリングポインタをより多く検出し、近接するダブルフリーを検出する)
- 追跡 割り当てが行われた場所を記録しておくと便利な場合があります。
私たちのローカルの自作システム(組み込みターゲット用)では、ランタイムオーバーヘッドがはるかに大きいため、トラッキングを他のほとんどのものから分離していることに注意してください。
これらのアロケーション関数/演算子をオーバーロードする他の理由に興味がある場合は、以下を参照してください。 グローバル演算子 new と delete をオーバーロードする理由は何ですか? ヒープ破壊のエラーを追跡するのに役立つ他のテクニックや、適用可能なツールもリストアップされています。
MSが使っているalloc/free/fenceの値を検索すると、ここで自分なりの答えを見つけてしまうので、以下は Microsoft dbgheap fill の値をカバーする別の回答 .
関連
-
[解決済み] テスト
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] Windowsにpipをインストールするにはどうしたらいいですか?
-
[解決済み] Node.jsアプリケーションをデバッグするにはどうすればよいですか?
-
[解決済み] Wi-Fi経由でAndroidアプリケーションを実行/インストール/デバッグしますか?
-
[解決済み] スタックトレースとは何ですか、またアプリケーションのエラーをデバッグするためにスタックトレースをどのように使用できますか?
-
[解決済み】WindowsでTCPまたはUDPポートをリッスンしているプロセスを見つけるにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】Enterキーを押して続行する
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] malloc/free/new/deleteでコンパイラがメモリを0xCDや0xDDなどに初期化するのはいつ、なぜですか?