4

我正在调试的应用程序有问题。稳态内存使用量为几百兆字节。偶尔(几个小时后)它会进入内存使用量飙升至数 GB 的状态。我希望能够在发生内存使用时立即停止程序。

在通过我自己的代码进行控制的地方,我可以使用如下代码捕获过多的内存使用:

bool usingTooMuchMemory()
{
    PROCESS_MEMORY_COUNTERS pmc;
    if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof pmc))
        return pmc.WorkingSetSize > 0x80000000u; // 2GB working set
    return false;
}

这对我没有帮助,因为我需要在正确的位置测试工作集大小。我真的希望程序在第一次中断malloc或者new使工作集或堆大小超过某个阈值。理想情况下,我希望通过 CRT 堆本身以最小的开销完成此操作,因为该库喜欢分配大量的小块。

可疑代码位于我的调用代码创建的线程中运行的 DLL 中。DLL 静态链接到 CRT,并且没有特殊的堆管理。我有 DLL 的源代码。

有任何想法吗?我错过了一些明显的东西吗?

4

3 回答 3

4

您可以使用_CrtSetAllocHook设置内存分配和释放挂钩。

于 2011-04-07T08:25:20.660 回答
1

HeapAlloc您可以使用Detours库来挂钩malloc 在内部调用的函数。

于 2011-04-07T11:57:32.577 回答
1

http://msdn.microsoft.com/en-us/library/aa366778%28v=vs.85%29.aspx

如果您清除 VS 的链接器选项中的 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志,程序的堆大小将被限制为 2GB,如果尝试获取超过该限制的内存,则应该崩溃。

于 2011-04-07T12:28:37.340 回答