Zip*_*per 19 debugging heap windbg
我一直在做一些关于高内存问题的工作,我在windbg中做了很多堆分析,我很好奇不同的列在"!heap -flt -s xxxx"命令中的含义.
我读了windbg!heap输出中'size'数字的含义是什么?,我查看了我的"Windows Internals"一书,但我仍然有一堆问题.所以列和我的问题如下.
**HEAP_ENTRY** - What does this pointer really point to? How is it different than UserPtr?
**Size** - What does this size mean? How is it different than UserSize?
**Prev** - This just appears to be the negative offset to get to the previous heap entry. Still not sure exactly how it's used.
**Flags** - Is there any documentation on these flags?
**UserPtr** - What is the user pointer? In all cases I've seen it's always 8 bytes higher than the HEAP_ENTRY, but I don't really know what it points to.
**UserSize** - This appears to be the size of the actual allocation.
**state** - This just tells you what state of this heap entry is (free, busy, etc....)
Example:
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
0015eeb0 0044 0000 [07] 0015eeb8 00204 - (busy)
Run Code Online (Sandbox Code Playgroud)
小智 21
HEAP_ENTRY 将已分配的块存储在连续的内存段中,每个分配的块以一个8字节的头开始,后跟实际分配的数据.HEAP_ENTRY列是已分配块的标头开头的地址.
大小 堆管理器处理8个字节的多个块.该列是分配的8字节块的数量.在您的示例中,0044表示该块占用0x220字节(0x44*8).
Prev 每8乘以一个字节到前一个堆块的负偏移量.
标志 这是一个编码以下信息的位掩码
0x01 - HEAP_ENTRY_BUSY
0x02 - HEAP_ENTRY_EXTRA_PRESENT
0x04 - HEAP_ENTRY_FILL_PATTERN
0x08 - HEAP_ENTRY_VIRTUAL_ALLOC
0x10 - HEAP_ENTRY_LAST_ENTRY
Run Code Online (Sandbox Code Playgroud)
UserPtr 这是由HeapAlloc(由malloc/new调用的)函数返回给应用程序的指针.由于标头总是8个字节长,因此总是HEAP_ENTRY +8.
UserSize 这是传递HeapAlloc函数的大小.
state 这是Flags列的解码,告诉条目是忙,释放,最后一段,...
请注意,在Windows 7/2008 R2中,堆默认情况下使用名为LFH(低碎片堆)的前端,该前端使用默认堆管理器来分配调度用户分配数据的块.对于这些堆,UserPtr和UserSize不会指向真实的用户数据.!heap -s显示的输出堆是LFH启用的.