查找Windows堆和模块之间的映射

时间:2009-08-27 14:35:13

标签: c++ windows memory-management heap

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

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堆,有些是标准堆,其他是低碎片堆。现在我想弄清楚哪个模块使用哪种堆。

非常感谢!

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

在程序的最开头添加CreateHeap调用,并在其上添加断点。跑。进入调用(进入反汇编级别)。设置一个新的断点。现在继续,每次创建新堆时都应该触发断点。调用堆栈将显示它来自何处。

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