!heap -p -a VS!heap -x

Kje*_*nar 7 windbg

我多年来一直使用!heap -p -a来完成各种任务.现在我开始使用最新的Win8 sdk中的WinDbg 6.2.9200在Win8上进行调试.

在这里,我发现!heap -p -a并不总是有效,并且来自!address的输出"广告"!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 !!
Run Code Online (Sandbox Code Playgroud)

Zac*_*gle 5

Windbg 使用不同的机制来查找堆信息,具体取决于您使用的标志。

-p标志告诉它您已通过或类似方式启用了页堆gflags.exe。启用页堆后,Windows 会保留一组单独的结构(_DPH_HEAP_ROOT和 co)来跟踪分配。如果 PageHeap 未打开,则不会有任何此类结构,因此您将不会得到任何输出。我还希望-p -a从地址向后搜索来尝试找到_DPH_HEAP_BLOCK描述分配的地址。

-x标志告诉 Windbg 遍历Windows 用于跟踪分配的_HEAP/结构。_HEAP_ENTRY这组结构描述了所有已通过标准分配器的活动分配(例如malloc, HeapAlloc`newLocalAlloc,)。

有几篇关于 Windows 堆分配器内部结构的精彩论文。我真的很喜欢Chris Valasek ( @nudehaberdasher ) 几年前发表的关于低碎片堆的论文,该论文在 Windows 7 中实现(并且该原理仍然适用于 Win8)