0

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

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 で書かれています。ある種のバッファ オーバーフローであると推測しているため、どこで発生しているかを検出する方法を見つけようとしています。

PageHeap (私が欲しいものを教えてくれるようです) と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 ダイアログが表示されました。

私は何が欠けていますか?

4

2 に答える 2

1

Windbgにアタッチすることで、アプリケーションをリリース モードで実行できます。

  • gflags(あなたが述べたように)を有効にし ます
  • アプリケーションをリリース モードで起動します。
  • Windbg のオプションを使用して Windbg にアタッチしAttach to processます。
  • リリース PDB の正しいパスを構成します。
  • .reload /f自動ロードが失敗した場合に備えて、PDB を手動で再 ロードします。
  • ユースケースを実行します。

WinDbg は、例外が発生するたびに実行を停止します。すべての最初の例外について、その理由を分析します。クラッシュのエラーの 1 つかもしれません。

于 2009-04-23T14:44:51.627 に答える
0

gFlags / PageHeapを使用する前に、アクセス違反の例外を確認することをお勧めします。まず、[ビルド]->[デバッグの開始]->[プロセスにアタッチ]オプションを使用してプロセスをアタッチします。アタッチされたら、[デバッグ]-> [例外]に移動して[アクセス違反]を選択し、[常に停止]チェックボックスをオンにして、アクセス違反の例外を有効にします。次に、デバッガーがアクセス違反の例外をキャッチするかどうかを確認します。

于 2009-04-23T14:17:14.127 に答える