堆积输出中的“大小”数字意味着什么? [英] What do the 'size' numbers mean in the windbg !heap output?

查看:176
本文介绍了堆积输出中的“大小”数字意味着什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 堆中的Segment00堆条目00150000 
00150640: 00640。 00040 [01] - 忙(40)
00150680:00040。 01808 [01] - 忙(1800)
00151e88:01808。 00210 [01] - 忙(208)
00152098:00210。 00228 [00]
001522c0:00228。 00030 [01] - 忙(22)
001522f0:00030。 00018 [01] - 忙(10)
00152308:00018。 00048 [01] - 忙(3c)

WinDbg文档说:

 堆中的Segment00堆数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
条目前一个曲线0x80 - HEAP_ENTRY_SETTABLE_FLAG3

地址大小标记(使用字节数) (标签名称)
00250000:00000。 00b90 [01] - 忙(b90)
00250b90:00b90。 00038 [01] - 忙(38)
00250bc8:00038。 00040 [07] - 忙(24),尾巴填充(NTDLL!LDR数据库)

间距是虽然文档很奇怪这是否意味着入场地址和前一个大小和大小,或者是入口prev和cur不是下面的行?



< prev size和cur size是什么意思?特别是关于'使用字节'。 bytes used和cur size之间有什么区别?

解决方案

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



要向前移动堆条目列表,我们可以使用Cur Size作为偏移量来获取下一个堆条目。 / p>

要向后移动堆条目列表,我们可以使用Prev Size作为偏移量来获取上一个条目的开头。



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





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


I see output like this in my DMP file:

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)

The WinDbg docs say this:

    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)

The spacing is weird in the docs though. Does that mean 'entry address' and 'prev size' and 'cur size', or are the 'entry' 'prev' and 'cur' not for the line below?

What does 'prev size' and 'cur size' mean? Especially with regard to 'bytes used'. What is the difference between 'bytes used' and 'cur size'?

解决方案

A heap segment is a continuous block of memory for a given heap. It is also a chain of heap entries.

To walk a list of heap entries forward we can use the Cur Size as an offset to get to the next heap entry.

To walk a list of heap entries backwards we can use the Prev Size as an offset to get to the beginning of the previous entry.

Here (picture below) you can see the psize (previous size) and its relationship to the size (current size) for the entry just before it.

The Bytes used is calculated by subtracting the size from the the number of unused bytes at the end of this block that were not actually allocated. This allows you to determine the size of the allocation that was requested before rounding the requested size to allocation granularity.

这篇关于堆积输出中的“大小”数字意味着什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆