Linux上的多线程C ++应用程序中的内存泄漏

时间:2012-06-11 16:18:06

标签: c++ linux memory-leak-detector

我们有一个在Linux上运行的大型多线程C ++应用程序。我们看到应用程序内存占用的速度越来越快,并且相信存在一些泄漏。我们已经尝试了我们拥有的每一种工具(valgrind,DynLeak,Purify),但没有找到任何东西。由于此应用程序可以在Windows上运行,我们还尝试了Bounds Checker。也没有帮助。

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

是否有适合此任务的好工具?

3 个答案:

答案 0 :(得分:5)

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

  • 您的应用程序很可能仍在使用该内存。在这种情况下,您可能会遇到 Java 程序员认为泄漏的情况,例如:在结构中输入数据,很少(或从不)删除条目。

  • 您可能错误地测量了内存的内存使用情况。在Linux上,内存使用量测量并不像它们看起来那么简单。你是如何衡量你的记忆力使用情况的?

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

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

  • 确保您的应用程序中没有使用自定义分配器或垃圾收集器。据我所知,没有内存分析工具可以使用没有user interference的自定义分配器。

  • 如果您的内存泄漏量足以在可接受的应用程序运行时间内检测到,您可以尝试通过版本控制系统对旧版本进行二进制搜索,以识别引入问题的提交。至少3个}} 并且Mercurial为此任务提供内置支持。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

为了帮助您调试问题,可能在您的日志记录中,您还应该编写内存大小,对象数量(类型)以及一些对您有用的其他统计信息。至少在你更熟悉你提到的工具之前。