如何从 Windbg 解释 !heap -l 的结果
How to interpret the result of !heap -l from Windbg
我有一个来自我怀疑有内存泄漏的进程的 3.5Gb 转储文件。我使用 Windbg 来分析转储文件,我使用的具体命令是 !heap -l(用于泄漏检测)。结果表明,检测到 807258 个潜在的不可达块。但是,我不知道如何使用分析结果。报告格式如下:
条目 |用户 |堆|段 |尺码 |上一个尺码 |未使用 |标志
00000000002e4190 | 00000000002e41a0 | 0000000000260000 | 0000000000260000 | 210 | 60 | 10 |忙
……(剩下的807258行)
我的理解是,heap 列告诉您泄漏来自哪个堆,但 Entry 和 User 代表什么?我在微软的在线文档中找不到任何解释。有人可以帮助我理解每一列的含义吗?
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()
or HeapAlloc()
.
返回的分配的开始
通常等于Entry
地址加上sizeof(_HEAP_ENTRY)
。
我有一个来自我怀疑有内存泄漏的进程的 3.5Gb 转储文件。我使用 Windbg 来分析转储文件,我使用的具体命令是 !heap -l(用于泄漏检测)。结果表明,检测到 807258 个潜在的不可达块。但是,我不知道如何使用分析结果。报告格式如下:
条目 |用户 |堆|段 |尺码 |上一个尺码 |未使用 |标志
00000000002e4190 | 00000000002e41a0 | 0000000000260000 | 0000000000260000 | 210 | 60 | 10 |忙
……(剩下的807258行)
我的理解是,heap 列告诉您泄漏来自哪个堆,但 Entry 和 User 代表什么?我在微软的在线文档中找不到任何解释。有人可以帮助我理解每一列的含义吗?
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()
or HeapAlloc()
.
通常等于Entry
地址加上sizeof(_HEAP_ENTRY)
。