ヒープの破損を追跡しているところです。標準のページヒープ検証を有効にしました
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.dll
ntdll.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マシンでも、スタックトレース検出アルゴリズムは完全に信頼できるものではありません。ブロックが割り当てられたブロックである場合、スタックトレースは割り当てされた瞬間のものです。ブロックが解放された場合、スタックトレースは解放された瞬間のものです。
しかし、割り当ての瞬間からスタックトレースが表示される可能性を高めることについて誰かが考えているのではないかと思います。
読んでくれてありがとう!