1

ヒープの破損を追跡しているところです。標準のページヒープ検証を有効にしました

gflags /p /enable myprogram.exe

これにより、破損を確認できます。

================================================== =========
ベリファイアストップ00000008:pid 0x1040:破損したサフィックスパターン

    10C61000:ヒープハンドル
    19BE0CF8:ヒープブロック
    00000010:ブロックサイズ
    00000000:
================================================== =========

gflags /p /enable myprogram.exe /full破損が発生したときにエラーが発生することを予期してフルページヒープ検証()をオンにすると、それ以上何も得られません。

Advanced Windows Debugging:Memory Corruption Part II—Heapsを読んでいるときに、希望を持ち始めました。これは、 AdvancedWindowsDebuggingの章です。http://support.microsoft.com/kb/311503に従って、WinDbgをインストールし、、のデバッグシンボルをダウンロードuser32.dllしました。これで、プログラムがデバッガーで停止したときに、次のコマンドを発行して、ヒープページに関する情報を確認できます。kernel32.dllntdll.dll

0:000> dt _DPH_BLOCK_INFORMATION 19BE0CF8-0x20
ntdll!_DPH_BLOCK_INFORMATION
   + 0x000 StartStamp:0xabcdaaaa
   + 0x004ヒープ:0x90c61000
   + 0x008 RequestedSize:0x10
   + 0x00c実際のサイズ:0x38
   + 0x010 FreeQueue:_LIST_ENTRY [0x0-0x0]
   + 0x010 TraceIndex:0
   + 0x018 StackTrace:(null)
   + 0x01c EndStamp:0xdcbaaaaa

(null)スタックトレースにがっかりしました。現在、 http: //msdn.microsoft.com/en-us/library/ms220938%28VS.80%29.aspxは次のように述べています。

StackTraceフィールドには、さまざまな理由で常にnull以外の値が含まれるとは限りません。まず第一に、スタックトレース検出はx86プラットフォームでのみサポートされ、第二に、x86マシンでも、スタックトレース検出アルゴリズムは完全に信頼できるものではありません。ブロックが割り当てられたブロックである場合、スタックトレースは割り当てされた瞬間のものです。ブロックが解放された場合、スタックトレースは解放された瞬間のものです。

しかし、割り当ての瞬間からスタックトレースが表示される可能性を高めることについて誰かが考えているのではないかと思います。

読んでくれてありがとう!

4

2 に答える 2

1

あはは!gflagsより多くのオプションを有効にする必要があることがわかりました:

gflags /i myprogram.exe +ust

これには次の効果があります。

ust - ユーザー モードのスタック トレース データベースを作成する

パラメータの説明を見るとわかりやすいようです。愚かな私。ただし、有効にする前にトレース データベースのサイズを設定する必要があるようです。

gflags /i myprogram.exe /tracedb 512

...または何でも(MB単位)。

于 2009-09-18T09:39:11.490 に答える
1

Microsoft によると、C ランタイム (CRT) モジュールの malloc 関数は、一部の Windows バージョンでフレーム ポインターの省略 (FPO) を使用します。malloc 関数の完全なスタック情報が表示されない場合があります。(http://support.microsoft.com/kb/268343)

可能であれば、この問題を解決するために、デバッグ バージョンの CRT をリンクしてみてください。たとえば、/MDd オプションを使用してリンクしてください。

于 2011-04-29T14:55:08.353 に答える