我正在debugging一个应用程序的问题。 稳态内存使用量是几百兆字节。 偶尔(几个小时后),它进入一个状态,内存使用量猛增到几千兆字节。 我希望能够尽快停止程序内存使用情况发生。
在控制权通过我自己的代码,我可以捕获过多的内存使用这样的代码:
bool usingTooMuchMemory() { PROCESS_MEMORY_COUNTERS pmc; if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof pmc)) return pmc.WorkingSetSize > 0x80000000u; // 2GB working set return false; }
这不能帮助我,因为我需要在正确的位置testing工作集大小。 我真的希望程序打破第一个malloc
或new
工作集或堆大小超过一定的阈值。 理想情况下,我希望CRT能够以最小的开销堆积起来,因为图书馆喜欢分配大量的小块。
可疑代码位于由我的调用代码创build的线程中运行的DLL中。 该DLL静态链接到CRT并没有特殊的堆pipe理。 我有DLL的源代码。
有任何想法吗? 我错过了什么明显的?
您可以使用_CrtSetAllocHook来设置内存分配和释放挂钩。
您可以使用Detours库挂钩HeapAlloc
函数,这是malloc在内部调用的函数。
http://msdn.microsoft.com/en-us/library/aa366778%28v=vs.85%29.aspx
如果清除VS的链接器选项中的IMAGE_FILE_LARGE_ADDRESS_AWARE标志,程序的堆将被限制为2GB,并且如果尝试获取将超过该限制的内存,则会崩溃。