Windbg !堆–;p&x2013;一对!堆–;x

Windbg !堆–;p&x2013;一对!堆–;x,windbg,Windbg,我已经用了很多年了!堆–p–a用于各种任务。 现在我开始使用最新的Win8 sdk中的WinDbg 6.2.9200在Win8上进行调试 在这里我发现了!heap–p–a并不总是有效的,而且 !地址“广告”的使用!堆–x(见下文) 看完这本书!堆-,我不明白其中的区别! 有谁知道区别吗 您使用哪个命令查看堆块的详细信息 0:008> !address 335168f8 <cut cut> Usage: Heap Base Address

我已经用了很多年了!堆–p–a用于各种任务。 现在我开始使用最新的Win8 sdk中的WinDbg 6.2.9200在Win8上进行调试

在这里我发现了!heap–p–a并不总是有效的,而且 !地址“广告”的使用!堆–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 !!
0:008>!地址335168f8
用法:堆
基址:32b43000
结束地址:33540000
地区规模:009fd000
状态:000011000 MEM_COMMIT
保护:0000000 4页\u读写
类型:00020000 MEM_PRIVATE
分配基数:32570000
分配保护:0000000 4页\u读写
更多信息:拥有地址的堆:!堆0xa80000
更多信息:堆段
更多信息:包含地址的堆条目:!堆-x 0x335168f8
0:008> !堆-x 0x335168f8
条目用户堆段大小PrevSize未使用标志
-----------------------------------------------------------------------------
335168f0 335168f8 00a80000 32570000 30 1c忙额外填充
0:008> !堆-p-a 0x335168f8
0:008>.echo“什么都没有!!”
没有什么!!

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

-p
标志表示您已通过
gflags.exe
或类似方式启用。启用页堆时,Windows会保留一组单独的结构(
\u DPH\u Heap\u ROOT
和co)用于跟踪分配。如果PageHeap未打开,则不会有任何此类结构,因此不会得到任何输出。我还希望
-p-a
只需从地址向后搜索,试图找到描述分配的
\u DPH\u HEAP\u块

-x
标志告诉Windbg遍历Windows用于跟踪分配的
\u堆
/
\u堆
项结构。这组结构描述了通过标准分配器进行的所有活动分配(例如,
malloc
new
LocalAlloc、
HeapAlloc`等)


有几篇关于Windows堆分配器内部结构的优秀论文。我真的很喜欢Chris Valasek()几年前在Windows 7中实现的低碎片堆上所做的工作(这些原则在Win8中仍然适用)。

“-p”不要求页面堆信息吗?我认为页面堆必须首先使用gflags之类的东西启用(在启动相关流程之前)。是的,我同意–p听起来像页面堆,但即使没有启用页面堆,“–p–a”也始终有效。而且它比–x快得多。无论如何,如果是–x,我必须处理它。6.2.9200也不能在我的机器上输出。6.12.2也没有。你的旧版本是什么?我有很多版本,所以我可以试一试。@Thomas W.我用过6.2.9200和6.3.9600。-x的问题是,在3 gb转储上需要几个小时:-(