我多年来一直使用!heap -p -a来完成各种任务。 现在我开始使用最新的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 !!
答案 0 :(得分:3)
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堆分配器的内部有一些很好的论文。我非常喜欢几年前{* 3}} Chris Valasek(paper)在Windows 7中实现的低碎片堆(并且原则仍适用于Win8)。