加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:42:14 所属栏目:Java 来源:网络整理
导读:我多年来一直使用!heap -p -a来完成各种任务. 现在我开始使用最新的Win8 sdk中的WinDbg 6.2.9200在Win8上进行调试. 在这里,我发现!heap -p -a并不总是有效,而且输出来自 !地址“广告”使用!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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读