我多年来一直使用!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)
Windbg 使用不同的机制来查找堆信息,具体取决于您使用的标志。
该-p标志告诉它您已通过或类似方式启用了页堆gflags.exe。启用页堆后,Windows 会保留一组单独的结构(_DPH_HEAP_ROOT和 co)来跟踪分配。如果 PageHeap 未打开,则不会有任何此类结构,因此您将不会得到任何输出。我还希望-p -a从地址向后搜索来尝试找到_DPH_HEAP_BLOCK描述分配的地址。
该-x标志告诉 Windbg 遍历Windows 用于跟踪分配的_HEAP/结构。_HEAP_ENTRY这组结构描述了所有已通过标准分配器的活动分配(例如malloc, HeapAlloc`new等LocalAlloc,)。
有几篇关于 Windows 堆分配器内部结构的精彩论文。我真的很喜欢Chris Valasek ( @nudehaberdasher ) 几年前发表的关于低碎片堆的论文,该论文在 Windows 7 中实现(并且该原理仍然适用于 Win8)。
| 归档时间: |
|
| 查看次数: |
1753 次 |
| 最近记录: |