Xcode调试内存最新理解

饭宝  金牌会员 | 2024-6-23 01:26:28 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 824|帖子 824|积分 2472

前提:
Xcode 16.0 beta
设置

Scheme设置中勾选Malloc ScribbleMalloc Stack Logging

这么做是为了在Memory GraphProfile中追溯数据在哪句代码生成。

此设置会导致App硬盘占用异常增多,调试完毕之后须要把选项关闭。
Allocations

许多人刚开始用它第一能看懂的是上方图标内存的实时变化。但对下方的各种数据和选项就一脸懵逼。本文首先想介绍上下交界的选项。

选中不同选项会切换到不同的视角,本文会着重提及后三个。
Allocations List

在这里须要注意的是可以点击黄色划线处来更改数据排序,右侧会体现创建这项数据时的方法堆栈。

点击橙色处则是过滤选项,光看选项名字实在是有些猜不懂意思,但鉴于小果果“优秀”的交互计划,用户把鼠标指针停留一会会自动体现选项的具体体现(计划真优秀的话就不会取这么难懂的名字了)。

表明这三种选项:

  • All  Allocations:所有
  • Created & Persistent:体现所选时间范围内,结束时仍然存在的分配情况。
  • Created & Destroyed:体现所选时间范围内,结束时已经不存在的分配情况。
这个选项个人也是经常用到的,由于我们看内存一般会选定一段内存开始分配到应该释放的时间段进行观察,这样过滤掉之后会发现有哪些内存数据在这个阶段应该释放但没有释放的标题(甚至对于编译器来讲都不算内存泄露)。
Call Trees

这里主要是从方法的角度来统计内存占用的空间,每一条数据都对应着一个方法,同时可以通过Bytes Used说明总占用内存空间,用Count表示总共调用此方法的次数。

在看的时候我实在还推荐在列表中右键,增加体现两组数据:Self BytesSelf %,这样看到是否当前方法是否占用内存,还是要再往深处寻找。

和上一节一样,右侧能看到具体的方法堆栈,橙色划线的选项功能也在上节介绍过,这里不再赘述。在这里还须要关注的是红色划线的Call Tree这个过滤选项。

五个选项一般能用到的就这三个:

  • Separate by Thread: 按照线程分类,好比向查看主线程是否任务过于繁重时可以用上
  • Invert Call Tree: 反向体现树
  • Hide System Libraries: 隐藏体系库,很多方法会最终调用到体系方法内,而很多体系方法内接着没完没了地向下调用体系方法,我们开辟者一般对此不会太感兴趣(标题真出在体系方法内里也没法改),一般会先选上。
Generations限于篇幅缘故原由姑且略过,实在也是非常有用的机制。它通过在时间轴增加节点,然后能返回到上一个时间节点之间出现的内存分配。另外提示故意人,节点是是时间轴上的小旗帜,并且可以移动小旗帜更改标记的时间点
实践:内存图分享至Instruments

实在这一节的内容才是让我萌生写文章的动机,究竟我们日常开辟场景时debug中才能碰到了内存暴涨之类的标题,这个时候我们才想去补缀内存,debug时检查内存一般会点击Debug Memory Graph

这里可以看到各种变量之间的引用关系,对于查找循环引用会非常直观,但是如果我们碰到标题是想找内存暴涨标题缘故原由的话就非常困难。
解决的方法是点击上图中红线位置的分享按钮,然后选择Instruments

于是来到了熟悉的界面。

你可以在这个基础上继续查找内存的标题,而且提示一下,如果你还没有中断刚才的debug的话,你可以在这个界面里把感兴趣的内存地点复制回Xcode,在内存图的角度继续检查。
总结

这次对Xcode的内存调试工具做了进一步的学习,同时解决了我一个疑惑:内存图可以从引用的维度调试标题,但应该如何衔接到Instruments继续研究,究竟看标题标角度不应该只有一个。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表