我正在调试的应用程序有问题。稳态内存使用量为几百兆字节。有时(几个小时后)它进入一种状态,其内存使用量猛增到数GB。我希望能够在内存使用发生这种情况时立即停止程序。

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

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

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

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

有任何想法吗?我是否缺少明显的东西?

最佳答案

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

09-11 19:19