我多年来一直使用!heap -p -a来完成各种任务.
现在我开始使用最新的Win8 sdk中的WinDbg 6.2.9200在Win8上进行调试.
现在我开始使用最新的Win8 sdk中的WinDbg 6.2.9200在Win8上进行调试.
在这里,我发现!heap -p -a并不总是有效,而且输出来自
!地址“广告”使用!heap -x(见下文).
看完了!堆 – ?,我无法理解差异!
知道差异的人吗?
您使用哪个命令来查看堆块的详细信息?
0:008> !address 335168f8 <cut cut> Usage: Heap Base Address: 32b43000 End Address: 33540000 Region Size: 009fd000 State: 00001000 MEM_COMMIT Protect: 00000004 PAGE_READWRITE Type: 00020000 MEM_PRIVATE Allocation Base: 32570000 Allocation Protect: 00000004 PAGE_READWRITE More info: heap owning the address: !heap 0xa80000 More info: heap segment More info: heap entry containing the address: !heap -x 0x335168f8 0:008> !heap -x 0x335168f8 Entry User Heap Segment Size PrevSize Unused Flags ----------------------------------------------------------------------------- 335168f0 335168f8 00a80000 32570000 30 30 1c busy extra fill 0:008> !heap -p -a 0x335168f8 0:008> .echo "nothing !!" nothing !!
解决方法
Windbg使用不同的机制来查找堆信息,具体取决于您使用的标志.
-p标志告诉它您已通过gflags.exe或类似功能启用了Page Heap.启用页面堆时,Windows会保留一组单独的结构(_DPH_HEAP_ROOT和co)以跟踪分配.如果没有打开PageHeap,则不会有任何此类结构,因此您将无法获得输出.我还希望-p -a只是从地址向后搜索,试图找到描述分配的_DPH_HEAP_BLOCK.
-x标志告诉Windbg遍历Windows用于跟踪分配的_HEAP / _HEAP_ENTRY结构.这组结构描述了经过标准分配器的所有活动分配(例如,malloc,new,LocalAlloc,HeapAlloc`等).
关于Windows堆分配器内部的一些很好的论文.我真的很喜欢paper Chris Valasek(@nudehaberdasher)几年前在Windows 7中实现的Low Fragmentation Heap(原则仍然适用于Win8).