Xcode调试内存最新理解

xcode · 浏览次数 : 0

小编点评

本文将为您介绍Xcode 16.0 beta中的内存调试工具,特别是如何使用Malloc Scribble和Malloc Stack Logging选项来追踪数据在代码生成过程中的位置。同时,本文还将介绍Allocations List、Call Trees和红色划线的Call Tree过滤选项,以及如何通过Instruments来解决内存问题。 1. Allocations List: 通过选中不同选项,可以切换到不同的视角。可以点击黄色划线处更改数据排序,右侧会显示创建这项数据时的方法堆栈。点击橙色处则是过滤选项,可以按照线程、时间轴等方式进行筛选。 2. Call Trees: 主要从方法的角度来统计内存占用的空间,每一条数据都对应着一个方法。可以右键增加显示两组数据:Self Bytes和Self %,以判断当前方法是否占用内存。右侧能看到详细的方法堆栈。 3. 红色划线的Call Tree过滤选项:按线程分类,可以查看主线程是否存在任务过于繁重的情况。反向显示树可以查看调用顺序的反向过程。隐藏系统库可以减少不必要的信息,提高搜索效率。 4. Instrumments: 通过点击上图中红线位置的分享按钮,可以选择Instruments来继续研究内存问题。Instruments可以帮助您找到内存泄漏、循环引用等问题。 总之,本文介绍了Xcode 16.0 beta中的内存调试工具,包括Malloc Scribble和Malloc Stack Logging选项的使用,以及Allocations List、Call Trees和红色划线的Call Tree过滤选项。同时,通过Instruments可以进一步研究内存问题,从而提高开发者的工作效率。

正文

前提:
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继续研究,毕竟看问题的角度不应该只有一个。

与Xcode调试内存最新理解相似的内容:

Xcode调试内存最新理解

前提: Xcode 16.0 beta 设置 Scheme设置中勾选Malloc Scribble、Malloc Stack Logging。 这么做是为了在Memory Graph、Profile中追溯数据在哪句代码生成。 此设置会导致App硬盘占用异常增多,调试完毕之后需要把选项关闭。 Allo

XCode汇编调试

汇编调试的意义 了解常用的汇编指令和知识,可以知道经过编译器优化后,最终的代码调用,有可能和源码并不相同,如:设置faster,smallest 代码会更短,最终的汇编执行指令与源码不一样。 可以研究代码在二进制层面的执行流程是否和源码的流程一致,从二进制层面研究方法调用的传参,内部调用,方法返回值

iOS使用Run Script提升开发效率

通过在Xcode Run Script添加shell脚本,然后通过脚本来帮助我们在编译阶段完成一下资源的copy,文件替换,修改等繁琐的事件。使Xcode在编译过程中自动完成耗时繁琐的操作提升开发效率。 添加脚本的过程很简单,添加+添加 添加完脚本后可以根据需要调整脚本的执行顺序,如:对应Bundl

Xcode的Search Paths配置

在Xcode中的文件搜索路径配置有两个地方,一个是Project层的配置,一个是Target的配置。 Project-Build Settings-Search Paths Target-Build Settings-Search Paths 在Target中的配置选项中,可以通过配置$(inher

Xcode编译流程

Xcode的构建过程本质上是执行一系列构建任务。如:代码检测,编译代码,链接目标文件,拷贝资源(图片, plist, nib)文件,代码签名等。大部分任务是执行命令行工具,如(clang编译、 ld链接、 codesign签名, altool上传)。这些工具使用xcode项目的配置信息,根据特定的顺

Xcode常用环境变量与常见使用场景

在Xcode的工程配置中,与路径相关的都是使用环境变量,这样可以避免使用决定路径时项目移植性差的问题。 Xcode常用宏 __FILE__ 当前文件所在目录 __DATE__ 编译日期的字符串,格式为“mm dd yyyy”(例如:“Sep 16 2015”) __FUNCTION__ 当前函数名称

Instruments中常用Template的使用

Instruments是苹果提供的Xcode套件,可用于分析iOS,MacOS程序的性能数据,进行性能提升。Instruments提供了很多类型的Template,用于特定场景的分析。这里选了3种常用的Template进行使用方法的讲解,对于其他Template的用法则用到时再了解吧,没必要一次把所

使用symbolicatecrash工具符号化Crash日志

对于打包上线的APP,或者打包测试的APP,出现了崩溃并不能方便的把手机链接到电脑使用XCode自动符号化,此时手动符号化就是重要的选项。 1.查找符号化工具symbolicatecrash find /Applications/Xcode.app -name symbolicatecrash -t

WWDC2023 Session系列:探索XCode15新特性

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/44a0e0fd567c4421bc94be83e84f6dce~tplv-k3u1fbpfcp-zoom-1.image) ## 一、版本说明 XCode 15 beta 发布于 2023

iOS测试包的安装方法

iOS测试包根据要安装的机器类型可以分为2种: .app模拟器测试包 .ipa真机测试包 .app模拟器测试包的安装方式 方式一:Xcode生成安装包 1.Xcode运行项目,生成app包 2.将APP包拖到模拟器中 方式二:IPA包下载得到安装包 1.将ipa包的后缀改成.zip, 然后解压 2.