!heap -p -a VS!heap -x

时间:2013-09-10 12:14:20

标签: windbg

我多年来一直使用!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 !!

1 个答案:

答案 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结构。这组结构描述了经过标准分配器的所有活动分配(例如,mallocnewLocalAlloc, HeapAlloc`等。

关于Windows堆分配器的内部有一些很好的论文。我非常喜欢几年前{* 3}} Chris Valasek(paper)在Windows 7中实现的低碎片堆(并且原则仍适用于Win8)。