我有一個追蹤一些堆腐敗的爆炸。我已經啓用標準頁堆驗證與如何避免DPH_BLOCK_INFORMATION中的「(null)」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
),這將導致錯誤在腐敗發生的時候發生,我什麼也沒有得到。
我在閱讀Advanced Windows Debugging: Memory Corruption Part II—Heaps時開始想起我的希望,這是的一章。我安裝了WinDbg,並根據http://support.microsoft.com/kb/311503下載了user32.dll
,kernel32.dll
,ntdll.dll
的調試符號。現在,當該程序在調試器暫停時,我可以發出此命令來查看關於堆的頁面信息:
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字段不會總是包含非空值。首先,僅在x86平臺上支持堆棧跟蹤檢測,其次,即使在x86機器上,堆棧跟蹤檢測算法也不完全可靠。如果塊是分配的塊,則堆棧跟蹤用於分配時刻。如果該塊被釋放,則堆棧跟蹤是空閒的。
但是我想知道是否有人有任何想法增加從配置時刻看到堆棧跟蹤的機會。
感謝您的閱讀!