【问题标题】:Finding heap or heap block or segment from address从地址中查找堆或堆块或段
【发布时间】:2014-02-03 01:09:35
【问题描述】:

我一直在调试软件中的堆损坏。我可以将数据写入堆并控制一些指针。我可以在不知道这一点的情况下实现执行代码的目标,但这让我有点困惑。

问题是我找不到要写入的块在哪个堆中,也找不到堆段。

我在 Windbg 下使用:!heap -x [address] and !heap -x -v [address],他们没有给我任何结果。 我知道当第一个堆中没有可用空间时,某些堆可能会保留另一个堆段。但是,我已经转储了所有堆段,但找不到与我正在寻找的基地址相似的任何人。

在我看来有点奇怪,没有进程或应用程序特定的堆有这些块!

【问题讨论】:

  • 是什么让您确定地址在堆上而不是在堆栈上(或者,在多线程程序的情况下,是堆栈之一)?
  • 我刚刚检查了该页面的访问权限,它没有“受保护”,应该保护堆栈。此外,主线程(我感兴趣的)正在堆块中编辑内存。
  • 很公平,只是检查... :)
  • 相关,可能有帮助:stackoverflow.com/a/353606/241536
  • 堆栈页面不受保护。堆栈的最后有一个保护页,但所有其他堆栈页都是完全可写的。

标签: c++ windows memory heap-memory windbg


【解决方案1】:

如果堆损坏,!heap –x 命令可能无法正常工作,

尝试使用 !heap –s –v 来确定。 示例:Windbg !heap

执行 !address ,你应该看看内存是堆栈还是堆。

【讨论】:

  • 感谢您提供的信息,我能够确定分配的来源,!address 帮助我获得了分配的基地址(我在 WinXP 下看到分配地址始终是静态的)。很明显,应用程序将不得不在一段时间内分配该空间,因此我在所有使用的 Allocations API 上设置了断点,我惊讶地发现应用程序正在使用 VirtualAlloc 分配该空间,这不是“堆”而是来自进程的虚拟空间的大块内存。现在很清楚为什么 !heap 没有提供任何细节。感谢您的帮助。
猜你喜欢
  • 2012-08-03
  • 2011-06-29
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多