質問

最終的に次のいずれかのメッセージが表示されてクラッシュするソフトウェアをデバッグしています。

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 /ページヒープを使用する前に、私はあなたがアクセス違反の例外をチェックすることをお勧め。まずビルド - >デバッグ - スタートを使用して、プロセスをアタッチ>オプションを処理するために取り付けます。 >例外を選択し、アクセス違反をデバッグ - チェックボックスの停止常にを選択するために行くことによってアクセス違反の例外を有効に取り付けられると。次に、あなたのデバッガが任意のアクセス違反の例外をキャッチするかどうかを確認します。

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