64

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

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

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

4

11 回答 11

65

有一个专门称为Leaks并且就像之前的海报所说的那样,运行它的最简单方法是直接从 Xcode 中运行:

运行 -> 从性能工具开始 -> 泄漏

它似乎非常擅长检测内存泄漏,并且对于像我这样的非 C 头来说很容易弄清楚。

于 2008-09-28T00:32:47.920 回答
25

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

一个商业替代品是OmniObjectMeter(由 Omni 集团停产)

于 2008-09-27T21:13:34.233 回答
12

Clang Static Analyser非常适合在 C、C++ 和 Objective-C 代码中查找错误:

于 2008-09-28T01:05:14.940 回答
6

您可以在 Xcode 中运行这些工具menu -> run -> start with performance tool -> ...

于 2008-09-27T21:21:28.627 回答
6

这是使用 xcode 中的仪器检测 ios/mac 应用程序的内存泄漏/性能的链接 从 Xcode 运行仪器的步骤

于 2013-08-29T06:47:47.743 回答
5

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

我对适用于 iPhone SDK 的工具特别感兴趣。

是的。苹果称它们为“仪器”(不仅仅是记忆工具)。

参见苹果的Introduction to Instruments User Guide. 特别是,请参阅Locating Memory Issues in Your App。它提供了如何使用面向内存的跟踪模板的示例。

于 2011-03-29T02:27:59.340 回答
4

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

它们的名称为您提供了关于它们的功能的一个很好的线索,OA,跟踪对象创建和 MA 是一个通用的内存泄漏工具。

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

假设您已注册 ADC iPhone 开发者网站,请点击以下链接:Instruments User Guide

于 2008-09-27T21:11:28.917 回答
4

使用时rustyshelf's solution请确保您在 iPhone 上而不是在模拟器上进行测试。内存使用情况大不相同。

于 2008-09-28T02:20:43.637 回答
4

对主要的内存泄漏工具做了一个总结:iphone-essential-performance-tools-list

于 2010-09-16T12:51:28.823 回答
4

在此处输入图像描述

步骤 1. 选择分配工具

  1. 为分配选择分析模板:

在此处输入图像描述

  1. 在 Instruments 主界面上,单击 VM Tracker(如果存在),然后按 Delete 键,因为您不需要该特定仪器:

在此处输入图像描述

通过单击右上角的加号按钮,您可以为不同类型的测试添加更多仪器,但我不会在本教程中介绍它们。

步骤 2. 设置仪器设置

在运行任何分析之前,您需要做一些事情。首先,您需要插入安装了您的应用程序的 iOS 设备。它必须是物理设备,因为 iOS 模拟器仍然是一个模拟器,可能无法准确地表示您的应用程序中的内存使用情况或应用程序在内存压力下的执行情况。

要选择您的目标,请单击顶部附近的我的电脑,将鼠标悬停在您的设备上,然后从子菜单中选择您的应用程序:

在此处输入图像描述

接下来,有一个面板,您可以在其中更改要查看的分配类型的设置。除了确保选中Created & Persistent气泡外,您无需事先做太多事情。

在此处输入图像描述

Step 3. 按记录运行仪器

按下左上角的记录按钮后,您的应用程序将在您的设备上启动,仪器将开始绘制您的分配图表。你需要做的就是运行你的应用程序,关注可能的问题区域,看看分配的内存是否多于释放的内存。这可能意味着要做很多重复性的任务,但你以后会感谢自己的。

您应该看到如下内容:

在此处输入图像描述

我建议你运行一次你的应用程序并在内存中达到一个稳定的点,这样你就有一个很好的基线,可以让任何增加都变得明显。当您对有足够的数据进行测试感到满意时,请按左上角的停止按钮。

步骤 4. 分析

  1. 我要做的第一件事是设置检查范围以测量基线处的总持久字节数。该持久字节数位于分配摘要的正下方。

在此处输入图像描述

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

在此处输入图像描述

  1. 然后,我将我的右检查范围移动到我再次运行应用程序并返回到我们的根的位置。在这里,您可以看到内存大致相同。因此,通过多次执行此操作并看到您的内存恢复到我们的基线,您可以假设没有重大内存问题。

在此处输入图像描述

有不同的方法来分析这些数据,我不会在这里介绍,但请注意,有一个完整的下拉菜单可以查看和分析您的数据。

在此处输入图像描述

步骤 5. 标记世代

如果您不想过多地处理检查范围,则有一个称为标记生成的功能。在仪器的右侧面板上有一个按钮。

在此处输入图像描述

此按钮将根据检查线的位置在仪器的时间线上标记点。它这样做是为了跟踪自上一个标记以来的所有分配,或者如果没有其他标记则从头开始跟踪。您可以在运行分配工具时或停止运行后标记世代,如下例所示:

在此处输入图像描述

步骤 6. 检查堆栈跟踪

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

在此处输入图像描述

深入

  1. 查看最大的分配并单击向右的箭头。很多时候,你点击的那些里面会有分配,其中很多对你没有意义。

在此处输入图像描述

  1. 当您在单击箭头后突出显示不同的分配时,请继续查看右侧面板上的扩展详细信息。最终,您会遇到一些粗体文本,这些文本会导致项目中的实际代码,告诉您问题可能是什么。

在此处输入图像描述

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

在此处输入图像描述

  1. 这个视图有很多有用的东西,其中一个是右侧大部分黄色的标签,显示每个方法调用占用了多少内存。每个应用程序都是不同的,因此开发人员必须确定突出显示的方法是否存在问题、您可以优化的东西,或者只是应用程序中不可避免的一部分。

  2. 在我的例子中,UIColor 变量在我们的应用程序中是持久的和使用的,因此在我们的应用程序的整个生命周期中都是可以接受的。

在这里找到

于 2016-04-24T08:09:42.543 回答
3

也试试这个,一个从 Xcode 工具开始的简单教程

内存泄漏工具:http ://www.raywenderlich.com/2696/

基本:http ://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode

于 2013-12-09T21:37:07.363 回答