我在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”是什么意思? 特别是关于“使用的字节”。 'bytes used'和'cur size'有什么区别?
堆段是给定堆的连续内存块。 这也是一堆堆条目。
为了遍历堆条目的列表,我们可以使用Cur Size作为偏移量来到下一个堆条目。
要向后走一堆堆条目列表,我们可以使用“上一个大小”作为偏移量,以便到达上一个条目的开始位置。
在这里(下图),您可以看到psize(之前的大小)及其与之前的条目的大小(当前大小)的关系。
所使用的字节数是通过从未实际分配的块末尾的未使用字节数中减去大小来计算的。 这样,您可以在将所请求的大小四舍五入到分配粒度之前确定请求的分配大小。