我正在寻找一种方法来查找堆和拥有堆的模块之间的映射。 我用以下方式检索堆:
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堆,有些是标准堆,其他是低碎片堆。现在我想弄清楚哪个模块使用哪种堆。
非常感谢!
答案 0 :(得分:6)
根据MSDN docs,GetProcessHeaps调用为您提供当前进程中所有堆的句柄,而不是系统中的所有堆,因此没有映射到其他进程。
答案 1 :(得分:2)
在程序的最开头添加CreateHeap
调用,并在其上添加断点。跑。进入调用(进入反汇编级别)。设置一个新的断点。现在继续,每次创建新堆时都应该触发断点。调用堆栈将显示它来自何处。
如果堆由全局对象创建,那么这些将在main()之前发生。您可以在C运行时启动代码中查找甚至更早设置断点。