2012-03-01 52 views
1

在WinDbg中,我執行命令!heap -s -v七個不同的堆腐敗引起的崩潰轉儲和所有有這些結果:我應該如何解釋WinDbg堆驗證結果?

..................List corrupted: (Blink->Flink = 0000000000000000) != (Block = 00000000026d0010) 
HEAP 0000000002030000 (Seg 00000000026d0000) At 00000000026d0000 Error: block list entry corrupted 

HEAP 0000000002030000 (Seg 00000000026d0000) At 00000000026d0000 Error: SegmentIndex field corrupted 

HEAP 0000000002030000 (Seg 00000000026d0000) At 0000000002749400 Error: invalid block size 

我應該如何解釋這些結果?

我解釋(Seg 00000000026d0000)意味着WinDbg的認爲它是一個段(_HEAP_SEGMENT),但它實際上是塊大緩存的地址(這是符合每個轉儲):

+0x2b8 LargeBlocksIndex : 0x00000000`026d0000 Void 

我已經證實,使用相同的操作系統和相同的進程創建的轉儲在WinDbg驗證發生之前不會出現任何問題。

總之,我不知道爲什麼WinDbg會抱怨26d0000的地址,或者爲什麼它可能會將它解釋爲段(如果這甚至是它所做的)。

所有轉儲來自Windows 2003 R2計算機。該過程是64位的。

回答

0

事實證明,我正在處理的特定崩潰是Windows 2003堆段(〜106 GiB)內部數據量限制的結果。記憶變得過於分散,程序無法在分段內找到空間,以便分配略低於1 MiB的分配。由於機器上物理內存的數量(192 GiB),並且由於RAM使用的每進程限制(8 TiB),我最初排除了這一點。

我還沒有弄清楚WinDbg結果的原因,但是我願意忽略它作爲一個可能的錯誤肯定從堆處於不一致的狀態與堆耗盡段內存時執行的代碼路徑。