猿问

当泄漏仪器没有显示时,如何调试内存泄漏?

当泄漏仪器没有显示时,如何调试内存泄漏?

我有一个用SWIFT编写的iOS应用程序,它正在泄漏内存-在某些情况下,一些对象应该被释放,但它们不是。我是通过简单的补充来了解这个问题的。deinit调试这样的消息:

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

因此,在发生导致对象释放的事件之后,deinit消息应该出现在控制台中。但是,对于一些应该释放的对象,消息丢失了。不过,泄漏开发工具不会显示任何泄漏。我如何解决这种情况?


慕斯王
浏览 499回答 3
3回答

饮歌长啸

在Xcode 8中,您可以单击“调试内存图”按钮,在调试工具栏中(显示在屏幕底部):只需标识左侧面板中您认为应该已解除分配的对象,它将显示对象图(如上面的主画布所示)。这对于快速确定在所涉对象上建立强引用的位置非常有用。从这里开始,您可以开始您的研究,诊断为什么这些强引用没有得到解决(例如,如果所讨论的对象具有来自本应被取消分配的其他对象的强引用,也可以查看该对象的图表,您可能会发现这个问题(例如,强引用周期、重复计时器等)。注意,在右边的面板上,我看到了呼叫树。我是通过打开方案设置中的“malloc堆栈”日志选项来实现这一点的:无论如何,这样做之后,您可以单击上面第一个屏幕快照的右面板中的堆栈跟踪中显示的相关方法调用旁边的箭头,您可以看到最初建立强引用的位置:上述内存诊断技术(及更多)将在WWDC 2016的后期演示。用Xcode进行可视化调试.在我最初的回答中,传统的仪器技术(如果使用旧版本的Xcode特别有用)将在下面描述。我建议使用具有“记录参考计数”功能的仪器“分配”工具:然后,您可以在“仪器”中运行该应用程序,然后搜索您知道正在泄漏的类,然后单击箭头钻进去:然后,您可以使用右侧的“ExtendedDetails”面板钻研详细信息并查看堆栈跟踪:在“扩展详细信息”面板中,将注意力集中在黑色代码上,而不是系统调用的灰色代码上。无论如何,在“扩展详细信息”面板中,您可以钻到源代码中,在仪器中:有关使用仪器追踪记忆体问题的更多资料及示范,请参阅:WWDC 2013视频修复内存问题WWDC 2012视频iOS应用程序性能:内存
随时随地看视频慕课网APP
我要回答