Debugging 如何解释的结果!堆-l来自Windbg

Debugging 如何解释的结果!堆-l来自Windbg,debugging,memory-leaks,windbg,Debugging,Memory Leaks,Windbg,我有一个3.5Gb的转储文件来自一个进程,我怀疑该进程存在内存泄漏。我使用Windbg分析转储文件,我使用的特定命令是!heap-l(用于泄漏检测)。结果表明,检测到807258个潜在的不可到达块。但是,我不知道如何使用分析结果。报告的格式如下: Entry | User | Heap | Segment | Size | PrevSize | Unused |标志 0000000000 2E4190 | 0000000000 2E41A0 | 0000000000 260000 | 00000

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

Entry | User | Heap | Segment | Size | PrevSize | Unused |标志

0000000000 2E4190 | 0000000000 2E41A0 | 0000000000 260000 | 0000000000 260000 | 210 | 60 | 10 |忙

…(807258行的其余部分)


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

Entry
是该堆分配的
HEAP\u条目的地址。这是没有证件的,但是看起来很像

您可以使用
dtnt查看它在您的系统上的外观_HEAP\u条目
甚至可以使用
dt nt查看特定的堆条目_堆\u项0000000000 2E4190

这是
nt的布局_在我的系统上堆\u条目

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
只是由或返回的分配的开始


它通常等于
条目
地址加上
大小(\u HEAP\u Entry)

谢谢你的回答。还有,这里的剂量大小是什么意思?是RTLALLOCATHEAP()或HeapAlloc()返回的实际分配大小吗?@OptimusPrime
size
字段直接从
nt_堆\u项
。不一定是请求的大小,而是堆管理器决定返回的分配大小,包括
nt占用的空间_堆\u项本身。这允许堆有一些摇摆的空间来找到一个大小接近但不一定精确的自由项。(续)它还允许一些优化,例如保持特定大小的所有项扣在一起,就像一个堆的情况一样。(注意:从
nt!\u HEAP\u ENTRY
中提取
Size
字段的棘手之处在于它是经过编码的。请参阅。当我使用!HEAP-l查找泄漏时,返回的堆项之一是0000000000 270000堆上的0000000000 2E73D0。但是当我使用!HEAP-a 0000000000 270000查找此堆上的所有堆项时,此项未列出。是否确定现在为什么泄漏的条目没有显示在那里?@OptimusPrime只是一个猜测,但是如果
!heap-l
在flags列中显示
LFH
(这是一个低碎片堆条目),那么
!heap-a
将不会打印关于该条目的任何内容。