【问题标题】:Find mapping between Windows heap and modules查找 Windows 堆和模块之间的映射
【发布时间】:2010-11-23 09:56:41
【问题描述】:

我正在寻找一种方法来查找堆与拥有该堆的模块之间的映射。 我通过以下方式检索堆:

HANDLE heaps[1025];
DWORD nheaps = GetProcessHeaps((sizeof(heaps) / sizeof(HANDLE)) - 1, heaps);
for (DWORD i = 0; i < nheaps; ++i) {
  // find module which created for heap 
  // ...
}

我想这样做的原因是,在我的应用程序中,我发现大约 40 个堆,一些是标准堆,另一些是低碎片堆。现在我想弄清楚哪个模块使用哪种堆。

非常感谢!

【问题讨论】:

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


    【解决方案1】:

    根据MSDN docs,GetProcessHeaps 调用会为您提供当前进程中所有堆的句柄,而不是系统中的所有堆,因此不会映射到其他进程。

    【讨论】:

    • 嗨蒂莫!非常感谢您的回答。您是对的,该函数仅检索当前进程的堆。我用了错误的术语,对不起。不过,有没有办法获得有关堆的更多信息,以便我可以找出谁创建了堆,例如DLL?
    【解决方案2】:

    在程序的最开始添加一个CreateHeap 调用并在其上放置一个断点。跑步。进入通话(进入反汇编级别)。设置一个新的断点。现在继续,每次创建新堆时都应该触发断点。调用堆栈会告诉你它来自哪里。

    如果堆是由全局对象创建的,那么这些将在 main() 之前发生。您可以在 C 运行时启动代码中四处寻找,以便更早地设置断点。

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 2012-01-01
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多