windbg – !heap -p -a VS!heap -x

前端之家收集整理的这篇文章主要介绍了windbg – !heap -p -a VS!heap -x前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我多年来一直使用!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 !!

解决方法

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

-p标志告诉它您已通过gflags.exe或类似功能启用了Page Heap.启用页面堆时,Windows会保留一组单独的结构(_DPH_HEAP_ROOT和co)以跟踪分配.如果没有打开PageHeap,则不会有任何此类结构,因此您将无法获得输出.我还希望-p -a只是从地址向后搜索,试图找到描述分配的_DPH_HEAP_BLOCK.

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

关于Windows堆分配器内部的一些很好的论文.我真的很喜欢paper Chris Valasek(@nudehaberdasher)几年前在Windows 7中实现的Low Fragmentation Heap(原则仍然适用于Win8).

原文链接:https://www.f2er.com/java/129513.html

猜你在找的Java相关文章