如何从Windbg解释!heap -l的结果

时间:2018-05-21 15:33:31

标签: debugging memory-leaks windbg

我有一个来自进程的3.5Gb转储文件,我怀疑它有内存泄漏。我使用Windbg来分析转储文件,我使用的具体命令是!heap -l(用于泄漏检测)。结果显示检测到807258个潜在的不可达块。但是,我不知道如何使用分析结果。该报告具有以下格式:

输入|用户|堆|细分|尺寸| PrevSize |未使用|标志

00000000002e4190 | 00000000002e41a0 | 0000000000260000 | 0000000000260000 | 210 | 60 | 10 |忙碌

......(807258行的其余部分)

我的理解是,heap列告诉你泄漏来自哪个堆但是Entry和User代表什么?我在微软的在线文档中找不到任何解释。有人可以帮我理解这些专栏的含义是什么吗?

1 个答案:

答案 0 :(得分:2)

Entry是该堆分配的HEAP_ENTRY的地址。它没有记录,但看起来something like this

您可以使用dt nt!_HEAP_ENTRY查看系统在系统中的外观,甚至可以使用dt nt!_HEAP_ENTRY 00000000002e4190查看特定的堆条目。

这是我系统上nt!_HEAP_ENTRY的布局:

0:007> dt nt!_HEAP_ENTRY
ntdll!_HEAP_ENTRY
   +0x000 UnpackedEntry    : _HEAP_UNPACKED_ENTRY
   +0x000 PreviousBlockPrivateData : Ptr64 Void
   +0x008 Size             : Uint2B
   +0x00a Flags            : UChar
   +0x00b SmallTagIndex    : UChar
   +0x008 SubSegmentCode   : Uint4B
   +0x00c PreviousSize     : Uint2B
   +0x00e SegmentOffset    : UChar
   +0x00e LFHFlags         : UChar
   +0x00f UnusedBytes      : UChar
   +0x008 CompactHeader    : Uint8B
   +0x000 ExtendedEntry    : _HEAP_EXTENDED_ENTRY
   +0x000 Reserved         : Ptr64 Void
   +0x008 FunctionIndex    : Uint2B
   +0x00a ContextValue     : Uint2B
   +0x008 InterceptorValue : Uint4B
   +0x00c UnusedBytesLength : Uint2B
   +0x00e EntryOffset      : UChar
   +0x00f ExtendedBlockSignature : UChar
   +0x000 ReservedForAlignment : Ptr64 Void
   +0x008 Code1            : Uint4B
   +0x00c Code2            : Uint2B
   +0x00e Code3            : UChar
   +0x00f Code4            : UChar
   +0x00c Code234          : Uint4B
   +0x008 AgregateCode     : Uint8B

User只是RtlAllocateHeap()HeapAlloc()返回的分配的开始。

它通常等于Entry地址加sizeof(_HEAP_ENTRY)