首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测和消除Linux应用程序中的内存泄漏

检测和消除Linux应用程序中的内存泄漏
EN

Stack Overflow用户
提问于 2011-11-07 18:42:57
回答 3查看 4.6K关注 0票数 3

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

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

在这种情况下,除了上面提到的内存泄漏检测工具之外,如何着手减少内存泄漏有一个重要的amount.Is在这些情况下人们使用general method来减少内存泄漏。

EN

回答 3

Stack Overflow用户

发布于 2011-11-07 19:35:54

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

  • 第一个问题:应用程序使用哪种语言?Valgrind非常适合C和C++,但不会在垃圾回收或脚本语言方面帮到你。所以首先要检查语言。java可能也有类似的东西,但是我没有用过那么多的java,所以你得去问别人,
  • 经常使用valgrind的设置。有几个插件可以帮助你做到这一点。一个例子是使用--leak-check=full或类似的选项。还有valgrind的插件,可以增强它的检测capabilities.
  • You比方说,应用程序被报告有一个内存泄漏。这是如何检测到的?应用程序是否自行检测到这一点。如果它是由应用程序自己检测到的,而没有任何外部工具,这可能意味着有人在应用程序中添加了自己的内存跟踪器。自定义内存跟踪器、内存池等使valgrind和任何其他泄漏检测系统变得非常糟糕。因此,如果应用程序中存在任何自定义内存处理,您唯一的选择就是停用它(如果可能)或挂接到这个自定义机制中。如何做到这一点只取决于你的应用程序。
  • 添加你自己的内存跟踪器。例如,在C++中,可以挂钩到新的/删除调用,并让它们跟踪内存。有几个库可以用于此目的。你也可以写你自己的新的/删除替换大约500LOC。如果您决定使用此方法,请务必阅读大量有关替换新的/删除的教程,因为在尝试此任务时,在C++世界中有几件事是不寻常的。
  • 是什么让您如此确定,应用程序中存在内存泄漏(即如何检测到此泄漏)?如果工具只是报告了大量分配的内存,这可能并不意味着存在实际的内存泄漏。内存泄漏意味着内存的句柄丢失,因此不可能每次到达并再次释放该内存。如果你的应用程序只是获得了大量的内存并保持它的可访问性,你可能会遇到一个完全不同的问题。例如,您可能只是在某一时刻使用了空间复杂度较差的算法,从而导致了许多分配。在这种情况下,您不需要泄漏检测器,而是需要一个内存分析器,它可以更详细地概述代码部分的内存占用情况。然而,我以前从未使用过分析器来完成这类任务,所以我不能给你更多的提示。
票数 2
EN

Stack Overflow用户

发布于 2011-11-07 18:50:22

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

也可能有自动化的工具可以让你做到这一点--不确定,没有使用过。但是这个方法是有效的。

票数 1
EN

Stack Overflow用户

发布于 2011-11-10 03:12:35

也许你也可以考虑使用Boehm's garbage collector (也就是使用GC_malloc而不是malloc等等……而不用担心free-ing数据)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8035319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档