给定一个指针,我怎么能找到它所属的_HEAP_ENTRY?

时间:2010-01-19 00:58:14

标签: windows heap windbg

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

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

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

1 个答案:

答案 0 :(得分:4)

!heap -p -a <address>

启用页面堆后,这会转储有用的信息(可能包括最后一个分配/释放此堆块的人的callstack) - 我认为这可以显示_DPH_HEAP_BLOCK。

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

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

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

  2. 它使!heap -p -a <address>命令转出更多有用的信息,包括最后一次释放它的callstack(!!)

  3. !heap + app verifier非常棒,可能仅次于ninja-windbg-foo列表中的内存写入断点,每个人都应该知道。