2009-09-18 42 views
1

我有一個追蹤一些堆腐敗的爆炸。我已經啓用標準頁堆驗證與如何避免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機器上,堆棧跟蹤檢測算法也不完全可靠。如果塊是分配的塊,則堆棧跟蹤用於分配時刻。如果該塊被釋放,則堆棧跟蹤是空閒的。

但是我想知道是否有人有任何想法增加從配置時刻看到堆棧跟蹤的機會。

感謝您的閱讀!

回答

1

啊哈!原來我需要讓更多的gflags選項:

gflags /i myprogram.exe +ust

其中有這樣的效果:

ust - Create user mode stack trace database

看起來非常簡單,當我看到參數說明。傻我。但我也似乎需要設置跟蹤數據庫的大小才生效:

gflags /i myprogram.exe /tracedb 512

......或任何(以MB爲單位)。

1

根據微軟的說法,C運行時(CRT)模塊中的malloc函數在某些Windows版本中使用了幀指針省略(FPO)。您可能看不到malloc函數的完整堆棧信息。 (http://support.microsoft.com/kb/268343)

如果可能,請嘗試鏈接調試版本CRT,例如,鏈接/ MDd選項,來解決這個問題。