4

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

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

有没有什么好工具可以完成这项任务?

4

3 回答 3

5

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

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

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

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

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

  • 确保您没有在应用程序中使用自定义分配器或垃圾收集器。据我所知,没有任何内存分析工具可以在没有用户干预的情况下与自定义分配器一起使用。

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

于 2012-06-11T16:33:07.403 回答
2

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

于 2012-06-11T16:25:44.437 回答
1

为了帮助您调试问题,也许在您的日志记录中,您还应该写入内存大小、对象数量(它们的类型)和一些其他对您有用的统计信息。至少在您更加熟悉您提到的工具之前。

于 2012-06-11T16:40:47.843 回答