Swift 中的分配工具工具没有提供足够详细的信息

Posted

技术标签:

【中文标题】Swift 中的分配工具工具没有提供足够详细的信息【英文标题】:Allocations instrument tool in Swift not providing detailed enough information 【发布时间】:2016-06-16 20:20:51 【问题描述】:

我正在尝试使用分配工具来分析 Swift 2 ios 应用程序。我这样做是这样的:

    使用分配工具运行应用程序。 应用启动后,我等待 10 秒,然后点击“Mark generation” 我打开我怀疑有内存泄漏的屏幕,等待 10 秒,关闭它,再等一会儿,然后点击“标记代数”

此时,我查看第二代以查看从未发布过的对象。我的麻烦是最大的罪犯总是只是“main”,它没有指向任何特定的类或方法

如上所示,“main”导致了几乎 80% 的内存泄漏,但堆栈跟踪并不指向任何特定的地方,不像它下面的泄漏指向特定的方法。

我不确定这是否相关,但是当我转到文件 -> 符号时,我显示了一个缺失的符号,就像这样。但是,我在机器上的任何地方都找不到这个符号:

我的问题是:这个“main”持有这么多内存是正常的,还是我端的某些配置错误导致我无法看到真正的堆栈跟踪?

【问题讨论】:

由于您正在处理一个具有完全机密标识符的完全机密项目,因此您应该按照 SO 规则的要求创建一个最小项目。否则膏药的数量让我觉得你的代码很糟糕。 为什么知道我的项目名称会帮助您解决我的问题? 如我所说,你花在膏药上的时间应该投入到创建一个最小的项目上。 你花在批评我的膏药上的时间应该花在回答我的问题上。 我绝对不会回答你的问题。你似乎忘记了提问者是谁。 【参考方案1】:

所以有几件事需要考虑。

1:要了解哪些对象已分配然后从未释放,您应该考虑使用分配摘要而不是代数。要查找“分配摘要”,请查看“详细信息”按钮旁边的“世代”。单击世代,然后切换到统计。然后在搜索栏中输入您的应用程序的名称(在我的情况下为 Fleet.),Instruments 将过滤分配给您创建的对象。请参阅下面的屏幕外观示例。

现在,要确定对象是否未被释放,您需要查看 Persistent 和 Transient 列。 Persistent 列显示当前存在的对象数,而 Transient 列显示已存在但已被释放的对象数。因此,如果您希望一个对象被解除分配,但 Transient 列中的数字没有改变,那么您就知道该对象没有被解除分配并且您遇到了问题!

2:如果您仍想使用 Generations 来确定是什么占用了所有内存,您可以取消选中 Invert Call Tree & Hide System Libraries 选项。例如,在我的屏幕上(如下所示),您会看到 main 占用了 A 代分配的内存的 76.5%。深入研究我可以发现大部分分配(45.2%)都分配给了 UIImages。

有关 Instruments 的更多详细信息和精彩教程,请参阅: https://www.raywenderlich.com/97886/instruments-tutorial-with-swift-getting-started

希望这会有所帮助! ?

【讨论】:

嗨,理查德。我会接受你的回答,谢谢。我认为我看到的主要区别是您可以深入了解占 76% 的“主要”分配,而我不是(它对我来说不可点击)。在您的示例中,您是否会解决/修复 UIImages 正在使用这么多内存的事实,或者您是否考虑系统功能的那部分并留下它? 我认为您无法深入了解主要分配的原因是您已检查的选项。如果取消选中 Invert Call Tree & Hide System Libraries 选项,“main”应该变成可点击的。 关于你的第二个问题。 76% 并不意味着正在使用大量内存。使用的总内存位于百分比左侧的字节列中。 (我的是 25.83 MB,你的是 3.21 MB)76% 只是总数的百分比。所以在你的情况下你应该没问题,虽然内存使用肯定是你想看的。【参考方案2】:

总结上面的讨论,“main”无法点击进入的原因是因为选择了“invert call tr​​ee”选项。取消选中“反转调用树”可以解决问题。

【讨论】:

以上是关于Swift 中的分配工具工具没有提供足够详细的信息的主要内容,如果未能解决你的问题,请参考以下文章

黑客是怎么截取数据包的?

基于用户名/别名作为 azure devops 中的参数获取用户/用户详细信息

磁盘上没有足够的空间完成此操作

C++ 中的内存分配分析

Swift 中的持久化 UIToolbar

开源.NetCore通用工具库Xmtool使用连载