2012-03-01 50 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结果的原因,但是我愿意忽略它作为一个可能的错误肯定从堆处于不一致的状态与堆耗尽段内存时执行的代码路径。