首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何调试内存泄漏时,泄漏仪器没有显示它们?

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

Stack Overflow用户
提问于 2015-06-23 09:15:51
回答 2查看 23.8K关注 0票数 70

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

代码语言:javascript
运行
复制
deinit {
    println("DEINIT: KeysProvider released")
}

因此,在发生导致对象释放的事件后,deinit消息应该出现在控制台中。但是,对于一些应该释放的对象,缺少该消息。尽管如此,leaks Tool没有显示任何泄漏。我该如何解决这种情况?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-23 11:42:46

在Xcode8中,您可以单击"Debug Memory Graph“按钮,

在调试工具栏(显示在屏幕底部)中:

只需在左侧面板中确定您认为应该释放的对象,它将向您显示对象图(如上图的主画布所示)。这对于快速识别在相关对象上建立强引用的位置非常有用。从这里,你可以开始你的研究,诊断为什么这些强引用没有被解决(例如,如果有问题的对象有来自其他应该被释放的对象的强引用,也可以查看该对象的图,你可能会发现问题(例如,强引用周期,重复计时器等)。

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

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

在我最初的回答中,下面描述了传统的Instruments技术(如果使用旧版本的Xcode,则特别有用)。

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

然后,您可以在Instruments中运行应用程序,然后搜索您知道正在泄漏的类,并通过单击箭头深入查看:

然后,您可以深入查看详细信息,并使用右侧的"Extended Details“面板查看堆栈跟踪:

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

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

视频WWDC 2021视频Detect and diagnose memory issues

票数 146
EN

Stack Overflow用户

发布于 2015-06-23 09:39:42

使用仪器检查由于保留但不是泄漏的内存而导致的泄漏和内存丢失。后者是仍然指向的未使用的内存。在仪器上的分配工具中使用标记生成(堆快照)。

有关使用堆快照查找内存碎片的信息,请参阅:bbum blog

基本上,该方法是运行Instruments allocate工具,获取堆,运行代码的迭代,并重复3到4次获取另一次堆。这将指示在迭代期间分配的和未释放的内存。

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

如果您需要查看对象的保留位置、释放位置和自动释放位置,请使用仪器:

在仪器中运行,在分配中设置"Record reference counts“on (对于Xcode 5和更低版本,您必须停止记录以设置该选项)。使应用程序运行,停止录制,向下钻取,您将能够看到所有保留、释放和自动释放发生的位置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30992338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档