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

问题描述:

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

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

在这种情况下,如何着手减少内存泄漏相当多的数量。有人使用general method在这种情况下,以减少内存泄漏,而不是像上面提到的内存泄漏检测工具。

+2

我曾经使用的最强大的内存泄漏检测器是[Valgrind with Memchecker](http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.leaks),我很漂亮惊讶它并没有帮助你。 –

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

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

+0

我很抱歉地说我对答案不满意。 –

+0

我没有问题,那个...... :-D希望你找到一个更好的(李's的答案看起来很有希望)。 – johndodo

通常Valgrind属于此任务的最佳工具。如果它不能正常工作,那么可能只有几件事情可以继续。

  • 第一个问题:应用程序使用什么语言? Valgrind对于C和C++非常有用,但对垃圾收集或脚本语言无助。所以先检查一下语言。对于java可能有类似的东西,但我没有用过那么多的java,所以你不得不问别人。

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

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

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

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

或许你也可以考虑使用Boehm's garbage collector(即使用GC_malloc代替malloc等等,而不是费心free -ing数据)。