回避方法“(null)” DPH_BLOCK_INFORMATIONのStackTrace?
質問
ヒープの破損を追跡しています。標準のページヒープ検証を有効にしました
gflags /p /enable myprogram.exe
そしてこれは破損の確認に成功します:
=========================================================== VERIFIER STOP 00000008: pid 0x1040: corrupted suffix pattern 10C61000 : Heap handle 19BE0CF8 : Heap block 00000010 : Block size 00000000 : ===========================================================
全ページヒープ検証( gflags / p / enable myprogram.exe / full
)を有効にすると、破損が発生したときにエラーが発生することが予想されるため、それ以上。
Windowsの高度なデバッグ:メモリ破損を読みながら、希望を持ち始めました。パートII—ヒープ。高度なWindowsデバッグ。 WinDbgをインストールし、 kernel32.dll
、 ntdll.dll
のデバッグシンボルをダウンロードしました。 //support.microsoft.com/kb/311503 "rel =" nofollow noreferrer "> http://support.microsoft.com/kb/311503 。デバッガでプログラムが停止したら、次のコマンドを発行してヒープページに関する情報を表示できます。
0:000> dt _DPH_BLOCK_INFORMATION 19BE0CF8-0x20 ntdll!_DPH_BLOCK_INFORMATION +0x000 StartStamp : 0xabcdaaaa +0x004 Heap : 0x90c61000 +0x008 RequestedSize : 0x10 +0x00c ActualSize : 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プラットフォームでのみサポートされ、2番目はx86マシンでもスタックトレース検出アルゴリズムが完全に信頼できるわけではありません。ブロックが割り当てられたブロックである場合、スタックトレースは割り当て時のものです。ブロックが解放された場合、スタックトレースはその瞬間になります。
しかし、割り当ての瞬間からスタックトレースが表示される可能性を高めることについて、何か考えている人はいるかもしれません。
読んでくれてありがとう!
解決
あはは!さらに多くの gflags
オプションを有効にする必要がありました。
gflags /i myprogram.exe +ust
次の効果があります:
ust - Create user mode stack trace database
パラメータの説明を見ると簡単に思えます。愚かな私。しかし、トレースデータベースのサイズを有効にする前に設定する必要もあるようです:
gflags /i myprogram.exe /tracedb 512
...または何でも(MB単位)。
他のヒント
Microsoftによると、Cランタイム(CRT)モジュールのmalloc関数は、一部のWindowsバージョンでフレームポインター省略(FPO)を使用します。 malloc関数の完全なスタック情報が表示されない場合があります。 (http://support.microsoft.com/kb/268343)
可能であれば、デバッグバージョンCRTのリンクを試みます。この問題を解決するには、/ MDdオプションを使用してリンクします。