Visual C++ のメモリ割り当ての問題をデバッグする
-
13-09-2019 - |
質問
最終的に次のいずれかのメッセージが表示されてクラッシュするソフトウェアをデバッグしています。
1. DAMAGE: after normal block (#24729280) at 0x00D710E0
2. Debug Assertion Failed
Program: D:\Soft\Test.exe
File: dbgheap.c
Line: 1017
Expression: _BLOCK_TYPE_IS_VALID(phead->nBlockUse)
このソフトウェアは非常に古いものですが、今すぐ変更することはできません。Visual C++ 6.0 で書かれています。私たちはこれが何らかのバッファ オーバーフローであると推測しているため、どこで発生しているかを検出する方法を見つけようとしています。
に関する情報を見つけました ページヒープ (私が望むものを伝えることができるようです)そして GFlags, 、しかし、それを機能させることはできないようです。
テストプログラムを作成しました。
char* test;
test = new char[5];
test[5] = 'a';
delete[] test;
エラーが発生します:
DAMAGE: after normal block (#55) at 0x1671920
次に、次のコマンドを実行して、PageHeap をアタッチしてみました。
gflags.exe /p /enable MemoryTest.exe /full
その後、(Visual C++ 6.0 インターフェイスと Windows エクスプローラーの両方で) 再実行すると、同じエラーが発生しました。
次に、リリース バージョンをコンパイルしようとし、Visual C++ 6.0 インターフェイスを通じて実行すると、次のエラーが発生しました。
User breakpoint called from code at 0x7c90120e
Windows エクスプローラーから、エラー レポートの送信を求める Windows ダイアログが表示されました。
私には何が欠けているのでしょうか?
解決
にアタッチすると、アプリケーションをリリース モードで実行できます。 ウィンドブログ.
- 有効にする
gflags
(あなたが言ったように) - リリースモードでアプリケーションを開始します。
- を使用して Windbg にアタッチします
Attach to process
Windbg のオプション。 - リリースPDBの正しいパスを構成します。
- 次を使用して PDB を手動でリロードします
.reload /f
自動負荷の場合。 - ユースケースを実行します。
WinDbg は、例外が発生するたびに実行を停止します。最初の例外ごとに、その理由を分析します。クラッシュのエラーの 1 つである可能性があります。
他のヒント
GFLAGS /ページヒープを使用する前に、私はあなたがアクセス違反の例外をチェックすることをお勧め。まずビルド - >デバッグ - スタートを使用して、プロセスをアタッチ>オプションを処理するために取り付けます。 >例外を選択し、アクセス違反をデバッグ - チェックボックスの停止常にを選択するために行くことによってアクセス違反の例外を有効に取り付けられると。次に、あなたのデバッガが任意のアクセス違反の例外をキャッチするかどうかを確認します。