内存泄漏检测工具

64

苹果的Xcode开发环境是否提供任何内存泄漏检测工具?

我对适用于iPhone SDK的工具特别感兴趣。目前这是我在业余编程项目中最喜欢的平台。

所述工具的文档/教程将非常有帮助。

11个回答

66

有一个专门被称为Leaks的工具,就像之前的一位发帖者所说,最简单的运行方式是直接从Xcode中执行:

运行 -> 使用性能工具开始 -> Leaks

它似乎非常擅长检测内存泄漏,并且对于像我这样的非C语言头脑来说也很容易理解。


6
请注意,在最近的OS X版本中,这实际上是Instruments的一部分。 这是找到内存泄漏的绝佳方式。 - Quinn Taylor
1
这个工具会不会出错?它说我有泄漏,但是我找不到泄漏的地方。 - locoboy

25

在Xcode 6中,从Product菜单中选择Profile以启动苹果的Instruments工具。(该应用程序位于Xcode应用程序包内容内:/Applications/Xcode.app/Contents/Applications/)

商业替代品是OmniObjectMeter。(已被The Omni Group停止支持)


2
OmniObjectMeter现在可以免费下载。 - Tony
2
有关如何使用苹果的 Instruments 的教程吗? - Nathan H
1
@nute:在苹果的网站上看WWDC视频。 - titaniumdecoy
我没有开发者/应用程序目录。 - user4951
1
@JimThio 您可以通过在 Xcode 的“产品”菜单中选择“配置文件”(cmd-I)来在Instruments中运行应用程序。从 Xcode 4.3 开始,Instruments 可以在 Xcode 应用程序捆绑包内找到:/Applications/Xcode.app/Contents/Applications/Instruments.app。 - titaniumdecoy

12

2
这就像说“gcc是一个代码覆盖工具”,因为它包含了gcov一样。Clang是LLVM C前端项目的总称。静态分析器被称为“Clang静态分析器”。 - Chris Hanson
Chris是正确的(当然),但事情已经有所改变。在Snow Leopard中,Xcode 3.2将以一种美妙的方式集成Clang静态分析器,它确实可以是发现泄漏的绝佳方式。 - Quinn Taylor
2
从xcode4+开始,您可以使用“产品>分析”来使用clang静态代码分析。这对于确保基础知识正确非常有帮助! - Chris
所请求的URL /StaticAnalysis.html在服务器上未被找到。 - iluvatar_GR

6

6

您可以在Xcode中通过菜单 -> 运行 -> 启动性能工具 -> ...来运行工具。


5
苹果的Xcode开发环境提供了内存泄漏检测工具吗?我特别关注适用于iPhone SDK的工具。

是的。苹果称其为"Instruments"(不仅仅是内存工具)。

请参阅苹果的介绍Instruments用户指南。特别是,请参阅定位应用程序中的内存问题。它提供了如何使用面向内存的跟踪模板的示例。


4

4

enter image description here

步骤1. 选择分配工具

  1. 选择用于Allocations的分析模板:

enter image description here

在主仪表板界面上,如果有的话,单击VM Tracker,然后按Delete键,因为您不需要该特定仪器:

enter image description here

点击右上角的加号按钮,您可以添加更多的工具来进行不同类型的测试,但在本教程中我不会涉及它们。
第二步。设置您的Instruments设置
在运行任何分析之前,有几件事情需要做。首先,您需要插入安装了您的应用程序的iOS设备。它必须是物理设备,因为iOS模拟器仍然是一个模拟器,可能无法准确表示您的应用程序的内存使用情况或应用程序在内存压力下的性能表现。
要选择您的目标,请在顶部附近单击“我的计算机”,将鼠标悬停在您的设备上,然后从子菜单中选择您的应用程序:

enter image description here

下一步,有一个面板可以更改您要查看的分配类型的设置。除了确保选中“已创建和持久”气泡外,您不需要事先做太多事情。

enter image description here

步骤 3. 按记录键运行工具

一旦您按下左上角的记录按钮,您的应用程序将在设备上启动,并且工具将开始绘制您的分配情况。在这里,您只需要运行应用程序,关注可能存在问题的区域,以查看是否有更多的内存分配而不是释放。这可能意味着要做很多重复的任务,但稍后您会感谢自己。

您应该会看到类似于这样的内容:

enter image description here

我建议您先运行应用程序,并达到内存稳定点,以便获得一个良好的基准线,这将使任何增加都更加明显。当您满意于测试数据时,请按左上角的停止按钮。
步骤4. 分析
1. 我首先设置检查范围,以测量基线下的总持久字节数。该持久字节数位于分配摘要下方。

enter image description here

要设置检查范围,请使用键盘快捷键Command <表示左侧检查范围,Command >表示右侧检查范围。在我们的应用程序中,我们有一个大约为20MB的基线。

enter image description here

  1. 然后,我将我的右侧检查范围移动到一个点上,在这个点上我再次运行了应用程序并回到了我们的根。在这里,你可以看到内存大致相同。因此,通过多次执行此操作并观察内存恢复到我们的基线,你可以假定没有重大的内存问题。

enter image description here

有不同的方法来分析这些数据,我这里不会涉及到所有的方法,但请注意,有一个下拉菜单可以选择多种方式来查看和分析您的数据。

enter image description here

步骤5. 标记代数

如果您不想过多处理检查范围,可以使用标记代数功能。该功能在仪器右侧面板上有一个按钮。

enter image description here

这个按钮将会在仪器时间轴上标记点,基于检查线所在的位置。它这样做是为了跟踪自上一个标记以来或者从一开始就没有其他标记时的所有分配情况。您可以在运行分配仪器时或停止运行后标记生成,就像这个例子中一样:

enter image description here

步骤6. 查看堆栈跟踪

最后要介绍的是查看堆栈跟踪。为此,您需要将检查范围设置为突出显示所有分配,然后查看统计视图,确保在右侧面板上选择了已创建和持久气泡。在统计视图中,确保按照持久字节从高到低排序。这里有很多分配,很难理解发生了什么,因为其中许多是系统分配。

enter image description here

深入了解

  1. 查看最大的分配并单击向右箭头。很多时候,您单击的分配内部会有其他分配,并且其中许多对您没有意义。

enter image description here

当你点击箭头并突出显示不同的分配时,请继续查看右侧面板上的详细信息。最终,您将找到一些粗体文本,其中包含您项目中实际代码的信息,告诉您可能存在的问题。

enter image description here

  1. 如果你双击堆栈跟踪中的粗体项,它会带你进入实际的代码(假设你在自己拥有的应用程序上运行了分配)。

enter image description here

  1. 这个视图有很多有用的功能,其中之一是右侧的大部分黄色标签,显示每个方法调用占用的内存量。每个应用程序都不同,因此您作为开发人员必须决定突出显示的方法是否是问题,您可以优化的内容,还是您应用程序中不可避免的一部分。

  2. 在我的情况下,UIColor变量是一种持久存在并且在我们的整个应用程序中使用的东西,因此在我们应用程序的生命周期内是可接受的。

在这里找到


4

ObjectAlloc和MallocDebug都可以帮助您。如果您安装了整个SDK,它们将在Developer->Applications->Performance Tools中找到。

它们的名称已经很好地提示了其功能,OA跟踪创建的对象,MA是一个通用的内存泄漏工具。

我还没有尝试过在iPhone开发中使用它们,但我相信它们也可以在那里使用。

假设您已经注册了ADC iPhone开发人员网站,在这里是要遵循的链接:Instruments用户指南


我该如何安装整个SDK? - user4951

4

当使用 rustyshelf 的解决方案 时,请确保在 iPhone 上进行测试,而不是模拟器。内存使用情况差异巨大。


虽然运行时内存使用不同,但管理内存的范式适用于所有Objective-C应用程序。泄漏就是泄漏,即使它可能以不同的方式或在奇怪的时间表现出来。 - Quinn Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接