windbg !heap 输出中的“大小”数字是啥意思?

Posted

技术标签:

【中文标题】windbg !heap 输出中的“大小”数字是啥意思?【英文标题】:What do the 'size' numbers mean in the windbg !heap output?windbg !heap 输出中的“大小”数字是什么意思? 【发布时间】:2011-02-11 23:50:41 【问题描述】:

我在我的 DMP 文件中看到这样的输出:

Heap entries for Segment00 in Heap 00150000
    00150640: 00640 . 00040 [01] - busy (40)
    00150680: 00040 . 01808 [01] - busy (1800)
    00151e88: 01808 . 00210 [01] - busy (208)
    00152098: 00210 . 00228 [00]
    001522c0: 00228 . 00030 [01] - busy (22)
    001522f0: 00030 . 00018 [01] - busy (10)
    00152308: 00018 . 00048 [01] - busy (3c)

WinDbg 文档是这样说的:

    Heap entries for Segment00 in Heap 250000
                        0x01 - HEAP_ENTRY_BUSY            
                        0x02 - HEAP_ENTRY_EXTRA_PRESENT   
                        0x04 - HEAP_ENTRY_FILL_PATTERN    
                        0x08 - HEAP_ENTRY_VIRTUAL_ALLOC   
                        0x10 - HEAP_ENTRY_LAST_ENTRY      
                        0x20 - HEAP_ENTRY_SETTABLE_FLAG1  
                        0x40 - HEAP_ENTRY_SETTABLE_FLAG2  
Entry     Prev    Cur   0x80 - HEAP_ENTRY_SETTABLE_FLAG3  

Address   Size    Size  flags       (Bytes used)    (Tag name)
00250000: 00000 . 00b90 [01] - busy (b90)
00250b90: 00b90 . 00038 [01] - busy (38) 
00250bc8: 00038 . 00040 [07] - busy (24), tail fill (NTDLL!LDR Database)

不过,文档中的间距很奇怪。这是否意味着'入口地址'和'prev size'和'cur size',或者'entry''prev'和'cur'不是下面的行?

“prev size”和“cur size”是什么意思?特别是关于“使用的字节数”。 'bytes used' 和 'cur size' 有什么区别?

【问题讨论】:

【参考方案1】:

堆段是给定堆的连续内存块。它也是一个堆条目链。

要向前遍历堆条目列表,我们可以使用 Cur Size 作为偏移量以到达下一个堆条目。

要向后遍历堆条目列表,我们可以使用 Prev Size 作为偏移量以到达上一个条目的开头。

在这里(下图),您可以看到 psize(之前的大小)及其与之前条目的大小(当前大小)的关系。

使用的字节数是通过从该块末尾未实际分配的未使用字节数中减去大小来计算的。这使您可以在将请求的大小四舍五入为分配粒度之前确定请求的分配大小。

【讨论】:

以上是关于windbg !heap 输出中的“大小”数字是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

"!heap -flt -s xxxx" windbg 命令中的不同列代表啥

WinDbg常用命令系列---!heap

如何使用WinDbg调试进程信息

转:windbg调试堆

Windbg找出memory leak的一种笨办法

你最喜欢的 Windbg 提示/技巧是啥? [关闭]