【问题标题】:Given a pointer, how might I find the _HEAP_ENTRY that it belongs to?给定一个指针,我如何找到它所属的 _HEAP_ENTRY?
【发布时间】:2010-01-19 00:58:13
【问题描述】:

我正在学习使用 WinDbg,我可能会偏离轨道,但我假设如果我的程序没有使用分页堆,而不是“拥有”指向我的分配的指针的 _DPH_HEAP_BLOCK 结构,我会为分配的数据使用_HEAP_ENTRY

给定堆上已分配数据的地址,我如何才能找到与它相关的 _HEAP_ENTRY(在 WinDbg 中),或者我的问题甚至没有意义?

我的问题的根源是我想知道转储中的分配是否被释放或堆是否以某种方式损坏。

【问题讨论】:

    标签: windows heap-memory windbg


    【解决方案1】:

    !heap -p -a <address>

    启用页面堆后,这会转储出有用的信息(可能包括最后一个分配/释放此堆块的人的调用堆栈) - 我认为这可视化了 _DPH_HEAP_BLOCK。

    如果不启用页面堆,它只会显示基本信息 - 这不是很有用。我认为这是常规的 _HEAP_ENTRY 结构。在第二次访问时调试双重释放/等几乎是不可能的(至少像我这样的凡人)。

    当遇到堆问题时,我立即通过 AppVerifier 启用堆验证,然后再次 repo。这做了两件事:

    1. 它将 AV 从“进一步”访问释放的内存移动到更早的时间点,有时使错误的根本原因显而易见

    2. 它使!heap -p -a <address> 命令转储出更多有用的信息,包括上次释放它的调用堆栈 (!!)

    !heap+app 验证器非常棒,在大家都应该知道的 ninja-windbg-foo 列表上可能仅次于内存写断点。

    【讨论】:

    • 另外,难道不能从地址返回到堆结构,否则 free 是如何工作的?
    • 我认为如果未启用页堆,相同的命令 (!heap -p -a
      ) 将转储 HEAP_ENTRY 进行分配;但 HEAP_ENTRIES 并没有那么有用。真正有助于追踪这些错误的是调试堆条目中的调用堆栈。
    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 2012-05-09
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2013-05-31
    相关资源
    最近更新 更多