在大内存分配上使进程崩溃

时间:2010-04-12 17:01:09

标签: c++ memory-leaks visual-studio-2008-sp1

我正在尝试发现一个重要的内存泄漏(一次15MB,但在多个地方进行这样的分配)。我检查了最明显的地方,然后使用了AQTime,但我仍然无法查明它。现在我看到剩下2个选项:

1)使用SetProcessWorkingSetSize:我已经尝试过了,但是当我用掉超过150MB的时候,我的过程很快就会继续运行:

DWORD MemorySize = 150*1024*1024;
SetProcessWorkingSetSize( GetCurrentProcess(), MemorySize/2, MemorySize*2 );

2)一次分配超过1MB时设置断点。我应该如何做到这一点,在内部使用'if> 1MB'重载operator new?

6 个答案:

答案 0 :(得分:1)

SetProcessWorkingSetSize并不意味着你认为它意味着什么 - 这是操作系统关于在内存中保留多少内存而不是分页到磁盘的线索。在将未使用的内存分页到磁盘时,现代操作系统非常积极 - 特别是Windows。

除了非常彻底的代码分析之外,

IBM Rational Purify是您唯一的解决方案。在Windows上,对于C / C ++,没有更好的工具来查找内存泄漏。在Mac或Linux上你可以使用valgrind,但是AFAIK,它尚未在Windows上运行。

答案 1 :(得分:1)

您使用的是c ++和visual studio。

在这种情况下,您可以简单地使用Microssoft为您提供的crt调试挂钩。

在msdn中搜索_CrtSetAllocHook。

在调试版本中,这将允许您拦截每个分配 - 您可以忽略小分区,只需设置一个断点或在大分段上调用:: DebugBreak。

答案 2 :(得分:0)

1)使用SetProcessWorkingSetSize:我已经尝试过了,但是当我用掉150MB以上时,我的过程很快就会继续运行:

什么是SetProcessWorkingSetSize返回?电话是否成功?

2)一次分配超过1MB时设置断点。我应该如何做到这一点,在内部使用'if> 1MB'重载operator new?
是的,这应该有用。

检查MSVC提供的C Runtime Debug Heap提供的工具可能会很有帮助。

答案 3 :(得分:0)

在嵌入式系统上,我们会按照您的建议完成 - 在任何对新/ memAlloc的调用超过某个阈值时中断,并在free / delete上执行相同操作。单调乏味,但它将完成工作。关于大小的条件断点应该做你想要的,但是在删除时,它会更糟糕。

答案 4 :(得分:0)

尝试使用UMDH。它是一个免费的Microsoft实用程序,允许查找内存泄漏。

答案 5 :(得分:0)

对不起,所有提议的解决方案都没有奏效。最后使用AQTime和大量的debugoutput修复了它。关机时泄漏得到了清理,所以它正在寻找大海捞针。

我仍然对如何有效地找到它感兴趣。我试图在new运算符上放置一个条件断点,但调试器花了很多时间来评估每个分配的“字节数> 1024 * 1024”。