当泄漏仪不显示内存泄漏时如何调试?

2020/11/28 13:22 · ios ·  · 0评论

我有一个用Swift编写的iOS应用,正在泄漏内存-在某些情况下,应该释放某些对象,但不能释放。我已经通过简单地添加如下deinit调试消息来了解此问题:

deinit {
    println("DEINIT: KeysProvider released")
}

因此,应该在导致对象释放的事件之后在控制台中出现deinit消息。但是,对于某些应释放的对象,该消息丢失。尽管如此,Leaks Developer Tool仍未显示任何泄漏。我该如何解决这种情况?

在Xcode 8中,您可以单击调试内存图按钮调试工具栏中的“调试内存图”按钮(显示在屏幕底部):

调试内存图

只需在左侧面板中标识您认为应该已重新分配的对象,它就会为您显示对象图(如上图主画布所示)。这对于快速确定在相关对象上建立强引用的位置非常有用。从这里,您可以开始研究,诊断为什么无法解析这些强引用(例如,如果所讨论的对象具有本应释放的其他对象的强引用,也可以查看该对象的图,您可能会发现问题(例如强参考周期,重复计时器等)。

注意,在右侧面板中,我看到了调用树。我是通过在方案设置中打开“ malloc堆栈”日志记录选项来实现的:

malloc堆栈

无论如何,这样做之后,您可以单击上面的第一个屏幕快照的右侧面板中的堆栈跟踪中显示的相关方法调用旁边的箭头,您可以看到最初建立强引用的位置:

码

上面的内存诊断技术(以及更多)在WWDC 2016的Xcode Visual Debugging的后一部分中进行了演示


在我的原始答案中,下面介绍了传统的Instruments技术(如果使用较旧版本的Xcode尤其有用)。


我建议使用具有“记录引用计数”功能的Instruments的“分配”工具:

记录参考计数

然后,您可以在Instruments中运行该应用,然后搜索您知道正在泄漏的课程,并通过单击箭头进行深入研究:

在此处输入图片说明

然后,您可以使用右侧的“扩展的详细信息”面板来深入研究详细信息并查看堆栈跟踪:

扩展细节

在“扩展的详细信息”面板中,将焦点放在黑色的代码上,而不是灰色的系统调用上。无论如何,您可以从“扩展的详细信息”面板中,直接在Instruments中钻取源代码:

您的代码

有关使用Instruments跟踪内存问题的更多信息和演示,请参考:

使用仪器检查由于保留但未泄漏的内存造成的泄漏和内存丢失。后者是仍指向的未使用的内存。在“乐器”上的“分配”乐器中使用“标记生成(堆放)”。

有关如何使用Heapshot查找内存不足的信息,请参见:bbum博客

基本上,该方法是运行Instruments分配工具,进行一次堆快照,运行代码的迭代以及再次进行3或4次重复的另一堆快照。这将指示在迭代期间已分配但未释放的内存。

要弄清楚结果,请公开查看各个分配。

如果您需要查看对象的保留,释放和自动释放位置,请使用以下工具:

在乐器中运行,在分配中设置“记录参考计数”(对于Xcode 5及更低版本,您必须停止记录才能设置该选项)。使应用程序运行,停止记录,向下钻取,您将能够看到所有保留,发布和自动发布发生的位置。

本文地址:http://ios.askforanswer.com/dangxielouyibuxianshineicunxieloushiruhediaoshi.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!