2010-04-12 123 views
4

我试图找到一个重大的内存泄漏(一次15MB,但在多个地方做这样的分配)。我检查了最明显的地方,然后使用了AQTime,但我仍然无法找到它。现在我看到左边2种选择:使大内存分配过程崩溃

1)使用SetProcessWorkingSetSize:我试过,但我高兴地过程中使用了更多的则150MB当运行保持:分配更多的时候

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

2)把一个断点然后一次1MB。我该如何做到这一点,超载运算符新的'如果> 1MB'在里面?

+2

你在哪里得到15MB号码?操作系统声称你的进程使用了​​多少空间?很多时候标准库会分配比您请求的更多的内存,并保留下一个新的内存。例如,1000个15K的分配仍然可能显示为一次泄漏15MB。 – 2010-04-12 17:32:28

回答

0

对不起,所有建议的解决方案都不起作用。它最终使用AQTime和大量的调试输出来修复。在关机时泄漏得到了清理,因此它在干草堆中寻找针。

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

1

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

IBM Rational Purify是您唯一的解决方案,而不是非常彻底的代码分析。在Windows上,对于C/C++,没有更好的工具来查找内存泄漏。在Mac或Linux上,您可以使用valgrind,但AFAIK,它尚未在Windows上工作。

0

1)使用SetProcessWorkingSetSize:我试过,但我高兴地过程中使用了更多的则150MB当运行保持:

什么是SetProcessWorkingSetSize回来?通话是否成功?

2)一次分配多于1MB时放置一个断点。我该如何做到这一点,超载运算符新的'如果> 1MB'在里面?
是的,这应该工作。

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

+0

SetProcessWorkingSetSize成功,它返回非零值 – Pieter 2010-04-12 17:12:44

0

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

0

尝试使用UMDH。这是一个免费的微软工具,可以查找内存泄漏。

1

从你的标签你正在使用c + +和visual studio。

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

搜索msdn for _CrtSetAllocHook。

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