检测并删除Linux应用程序中的内存泄漏

我们有一个非常大的项目,基本上是一个使用Linux应用程序编程并在PowerPC处理器上运行的应用程序。 这个项目最初是由另一家公司开发的。 我们从公司收购了这个项目,现在我们正在维护这个项目。

据报道,该应用程序有很多memory leak问题。 由于这是一个大型项目,因此无法访问每个源代码文件并找出内存泄漏。 我们使用Valgrid,mpatrol和其他内存泄漏检测工具。 这些工具没有多大帮助,内存泄漏也没有减less很多。

在这种情况下,如何大量减less内存泄漏。除了像上面提到的内存泄漏检测工具之外,还有一种人们用这种general method来减less内存泄漏的general method

通常Valgrind属于这个任务的最佳工具。 如果它不能正常工作,可能只有一些事情可以做。

  • 第一个问题:应用程序使用什么语言? Valgrind对于C和C ++来说是非常好的,但是对于垃圾回收或者脚本语言并不会有帮助。 所以先检查一下语言。 java可能有类似的东西,但是我没有用过那么多的java,所以你不得不去问其他人。

  • 用valgrind的设置玩很多。 有几个插件,可以帮助这个。 一个例子可能是使用--leak-check=full或类似的选项。 还有valgrind的插件,可以增强它的检测能力。

  • 你说,应用程序被报告有内存泄漏。 这是如何检测到的? 应用程序本身是否检测到这一点。 如果应用程序在没有任何外部工具的情况下检测到它,这可能意味着有人在应用程序内部添加了自己的内存跟踪器。 自定义的内存跟踪器,内存池等混乱valgrind和任何其他泄漏检测系统非常糟糕。 因此,如果应用程序中存在任何自定义内存处理,则唯一的选择是将其停用(如果可能)或挂钩到此自定义机制中。 如何做到这一点取决于你的应用程序。

  • 添加你自己的记忆跟踪器。 例如在C ++中,可以挂钩到新的/删除的调用,并让他们跟踪内存。 有几个库可以用来做这个。 您也可以在约500 LOC中编写自己的新/删除替换。 如果你决定使用这个方法,一定要阅读很多关于替换new / delete的教程,因为在尝试这个任务的时候,在C ++世界里有几件事是不寻常的。

  • 是什么让你如此肯定,应用程序中有内存泄漏(即如何检测到)? 如果一个工具只报告了大量的分配内存,这可能甚至不意味着存在实际的内存泄漏。 内存泄漏意味着内存的句柄丢失,因此不可能再次到达并释放内存。 如果您的应用程序获得了大量内存并保持可访问性,您可能会遇到完全不同的问题。 例如,您可能只是使用一个空间复杂度较差的算法,导致很多分配。 在这种情况下,您不需要泄漏检测器,而是使用内存分析器,它可以更详细地查看代码部分的内存占用情况。 不过我以前从来没有用过这个任务,所以我不能再给你提示。

你可以用调用你自己的分配方法来替换所有的内存分配调用,它们应该调用原始方法,同时计算内存使用情况和分配的位置。 这将允许您找到泄漏并手工消除。

也可能有自动化工具,让你做到这一点 – 不知道,没有用过。 但是这个方法可行。

也许你也可以考虑使用Boehm的垃圾回收器 (即使用GC_malloc而不是malloc等),而不用担心free数据。