IPHONE:使用仪器分析泄漏

Posted

技术标签:

【中文标题】IPHONE:使用仪器分析泄漏【英文标题】:IPHONE: Analyzing leaks with instruments 【发布时间】:2009-10-27 22:39:20 【问题描述】:

我正在尝试使用仪器定位泄漏点,但我看到的泄漏点与下图中的泄漏点类似:

leaks

如您所见,没有关于哪一行代码正在泄漏的信息。我的所有泄漏,大约 20 个,都是这样的,或者换句话说,泄漏没有特别显示我的任何代码行。

这张图片中的泄漏与 CoreFoundation 上的“_CFAllocatorSystem”(???) 有关,我还有其他人只是简单地说 GSEvent。我不知道是什么产生了这些。

我怎样才能发现这一点?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

我认为您想在泄漏运行后进入仪器并选择“源视图”。然后您需要将源文件拖到仪器窗口中。然后它将显示代码中发生泄漏的行以及调用堆栈。

我的一些折腾代码泄漏了视图。在 Instruments 中看起来像这样: alt text http://img688.imageshack.us/img688/9669/screenshot20091028at131.png

【讨论】:

【参考方案2】:

Leaks 向您展示的是,对分配泄漏对象的代码的跟踪(这意味着它被保留,但您的应用程序没有留下具有该地址的变量)。它没有向您显示的只是对象应该被释放到不会导致泄漏的位置,因为这是不可能知道的(可以找到当前调用释放的位置,但这可能没有太大帮助)。

所以这条跟踪告诉我的是,系统分配的一些内存被你保留了,然后忘记了引用 - 一个关键是“PurpleEvent”行,这在处理线程的线程中很常见计时器事件或通知。可能是您收到了通知并保留了一些信息,但后来没有发布。

如果您知道泄漏发生的时间点,您应该能够隔离在那段时间运行的代码。

【讨论】:

【参考方案3】:

请参阅here,尤其是这句话:

此列表会告知您泄漏对象的类型、大小、地址,甚至它们的调用堆栈。

然后就可以通过调用栈追踪泄露内存的来源了。

堆栈跟踪准确地显示了哪一行是罪魁祸首。在您的情况下,显然 main.m 中的第 14 行。不知道你在困惑什么?

【讨论】:

抱歉,您的回答没有显示任何解决问题的方法。你有没有点击我发布的图片?我的图像与你的图像几乎不相上下,知道对象类型、大小、地址和调用堆栈无助于了解是什么产生了这个。 如果您查看几乎所有使用模板创建的 iPhone 项目,main.m:14 只是清空自动释放池的那一行——它实际上与泄漏源无关,这只是前进的一步。 和 main.m:14 指向整个应用程序,类似于“此应用程序上有一个链接”,但我知道。【参考方案4】:

有罪的是加速度计,我正在为 OS 3.0 进行编译。

换句话说,Apple 声称其泄漏已修复的加速度计仍然在泄漏。

【讨论】:

以上是关于IPHONE:使用仪器分析泄漏的主要内容,如果未能解决你的问题,请参考以下文章

iphone/ipad 内存泄漏仪器工具

如何解决 xcode(仪器)中的 iPhone 应用程序内存泄漏

内存泄漏 - iPhone

奇怪的内存泄漏

iPhone:学习“乐器”的资源?

iphone App中的内存泄漏