多年来,我一直使用!heap -p-a执行各种任务。现在,我开始使用最新的Win8开发工具包中的WinDbg 6.2.9200在Win8上进行调试。
在这里,我发现!heap -p-a并不总是有效的,而且!address“advertise”使用了!heap -x(如下所示)。
在读完!heap -?之后,我无法理解其中的区别!有人知道其中的区别吗?
您使用哪个命令来查看堆块的详细信息?
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 !!发布于 2014-06-20 01:13:59
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堆分配器的内部原理,有一些很棒的论文。我真的很喜欢Chris Valasek (@nudehaberdasher)几年前在低碎片堆上所做的paper,它是在Windows7中实现的(原则仍然适用于Win8)。
https://stackoverflow.com/questions/18718707
复制相似问题