2012-06-11 67 views
4

我们在Linux上运行着一个大型多线程C++应用程序。我们看到应用程序内存占用增长很快,并认为存在一些泄漏。我们尝试了我们所有的工具(valgrind,DynLeak,Purify),但没有找到任何东西。由于这个应用程序可以在Windows上运行,我们也尝试了Bounds Checker。也没有帮助。Linux上多线程C++应用程序中的内存泄漏

我们需要一个可以提供帮助的新工具。我曾看过Google Perfomrance Tools,MemCheck Deluxe的Paul Nettle的MMGR。他们没有给我留下深刻的印象。

是否有任何地方有这个任务的好工具?

+4

如果上述工具无法找到泄漏,那么您认为是否有泄漏?你的应用程序可能只是使用所有的内存。或者,即使它没有使用它,你的应用仍然保留着内存。对于最后一种情况,不会有泄漏,只是内存使用或清理效率低下。 –

+0

也许[this](http://blogs.msdn.com/b/ie/archive/2007/11/29/tools-for-detecting-memory-leaks.aspx)可以提供帮助。但是如果没有使用其他工具检测到泄漏,你怎么能确定存在内存泄漏? –

+0

泄漏可能存在于第三方库中,或者您可能只是在应用程序或操作系统中看到资源池和其他缓存的结果......大内存使用不一定是内存泄漏的标志。看看它是否在相同的负载下不断增长。 – AJG85

回答

2

如果通过“没有帮助”,你的意思是它没有报告内存泄漏,这是很有可能你没有一个,只是使用越来越多的内存仍然是由指针引用,可以删除。

+0

不幸的是,我们确实有一些东西。几个月前,应用程序在未经确认的更改后开始表现如此。这是我们寻找泄漏​​的原因。 – GMichael

+1

@Michael:您是否尝试过通过您的版本控制系统进行二分搜索以确定导致泄漏的提交? – thkala

+0

我希望这是可行的。我们有几十个开发人员在开发应用程序。 – GMichael

5

C/C++中内存泄漏的定义非常具体:它是已分配的内存,然后指针被覆盖或丢失。 Valgrind通常会立即检测这种情况,但情况并非总是如此简单。

  • 您的应用程序可能仍然使用该内存。在那种情况下,你可能会有什么样的程序员会考虑泄漏,例如,在一个结构中输入数据,很少(或从不)删除条目。

  • 您可能会错误地测量内存的内存使用情况。在Linux上,内存使用量测量并不像看起来那么直截了当。你如何衡量你的内存使用情况?

  • 您应该考虑使用您正在使用的任何内存分析工具的应用程序挂钩(Valgrind称它们为client requests),以避免仅在程序终止时发出的报告问题。使用这些钩子可能会帮助您确定泄漏的位置。

  • 您应该尝试使用来自Valgrind的堆分析器(例如massif)查找具有过多分配内存的内存分配位置。

  • 确保在应用程序中未使用自定义分配器或垃圾回收器。据我所知,没有内存分析工具将使用自定义分配器,没有user interference

  • 如果您的内存泄漏足够大,可以在可接受的应用程序运行时间内检测到,您可以尝试通过版本控制系统对旧版本进行二进制搜索以确定引入该问题的提交。至少MercurialGit为此任务提供了内置支持。

1

为了帮助您调试问题,也许在你的记录,你也应该写的内存大小,数量的对象(其类型)和其他一些统计数据,其是对你有用的。至少在你更熟悉你提到的工具之前。

+1

+1用于应用程序内日志/调试代码。在我的一个应用程序中,我必须检查Windows上的内存泄漏。在那个平台上我没有任何工具可用,我写了一个'malloc()'和'free()'的包装器,用于跟踪所有的内存分配和释放。一个相当极端的解决方案,但它的工作! – thkala

+0

我同意你的意见并向我们的经理提议。尽管如此,我还是希望为这项工作找到一个行之有效的工具。你的方式非常复杂和令人厌烦。但是,如果没有任何帮助,我们会采取。 – GMichael