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

时间:2011-11-07 10:42:57

标签: linux memory-leaks

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

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

在这种情况下,如何大幅度减少内存泄漏。在这些情况下,除了上面提到的内存泄漏检测工具之外,人们使用general method来减少内存泄漏

3 个答案:

答案 0 :(得分:2)

通常Valgrind属于这项任务的最佳工具。如果它不能正常工作,可能只有几件事你仍然可以做。

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

  • 使用valgrind的设置进行大量游戏。有几个插件可以帮助解决这个问题。一个示例可能是使用--leak-check=full或类似选项。还有valgrind的插件,可以增强它的检测能力。

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

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

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

答案 1 :(得分:1)

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

也可能有自动化工具允许您这样做 - 不确定,没有使用任何。但这种方法有效。

答案 2 :(得分:0)

也许您也可以考虑使用Boehm's garbage collector(使用GC_malloc代替malloc等...而不用担心free - 数据)。