7

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

在这里,我发现 !heap –p –a 并不总是有效,并且 !address 的输出“广告”使用 !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 !!
4

1 回答 1

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,、、HeapAlloc`等)newLocalAlloc,

关于 Windows 堆分配器的内部结构有几篇很棒的论文。我真的很喜欢Chris Valasek ( @nudehaberdasher ) 几年前在 Windows 7 中实现的 Low Fragmentation Heap 的论文(这些原则仍然适用于 Win8)

于 2014-06-19T17:13:59.110 回答