Xcode调试内存最新理解
前提:
Xcode 16.0 beta
设置
Scheme设置中勾选Malloc Scribble、Malloc Stack Logging。

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

此设置会导致App硬盘占用异常增多,调试完毕之后需要把选项关闭。
Allocations
许多人刚开始用它第一能看懂的是上方图标内存的实时变化。但对下方的各种数据和选项就一脸懵逼。本文首先想介绍上下交界的选项。

选中不同选项会切换到不同的视角,本文会着重提及后三个。
Allocations List
在这里需要注意的是可以点击黄色划线处来更改数据排序,右侧会显示创建这项数据时的方法堆栈。

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

解释这三种选项:
- All Allocations:所有
- Created & Persistent:显示所选时间范围内,结束时仍然存在的分配情况。
- Created & Destroyed:显示所选时间范围内,结束时已经不存在的分配情况。
这个选项个人也是经常用到的,因为我们看内存一般会选定一段内存开始分配到应该释放的时间段进行观察,这样过滤掉之后会发现有哪些内存数据在这个阶段应该释放但没有释放的问题(甚至对于编译器来讲都不算内存泄露)。
Call Trees
这里主要是从方法的角度来统计内存占用的空间,每一条数据都对应着一个方法,同时可以通过Bytes Used说明总占用内存空间,用Count表示总共调用此方法的次数。

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

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

五个选项一般能用到的就这三个:
- Separate by Thread: 按照线程分类,比如向查看主线程是否任务过于繁重时可以用上
- Invert Call Tree: 反向显示树
- Hide System Libraries: 隐藏系统库,很多方法会最终调用到系统方法内,而很多系统方法内接着没完没了地向下调用系统方法,我们开发者一般对此不会太感兴趣(问题真出在系统方法里面也没法改),一般会先选上。
Generations限于篇幅原因姑且略过,其实也是十分有用的机制。它通过在时间轴增加节点,然后能返回到上一个时间节点之间出现的内存分配。另外提醒有心人,节点是是时间轴上的小旗子,并且可以移动小旗子更改标记的时间点
实践:内存图分享至Instruments
其实这一节的内容才是让我萌生写文章的动机,毕竟我们日常开发场景时debug中才能遇到了内存暴涨之类的问题,这个时候我们才想去修理内存,debug时检查内存一般会点击Debug Memory Graph。

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

于是来到了熟悉的界面。

你可以在这个基础上继续查找内存的问题,而且提醒一下,如果你还没有中断刚才的debug的话,你可以在这个界面里把感兴趣的内存地址复制回Xcode,在内存图的角度继续检查。
总结
这次对Xcode的内存调试工具做了进一步的学习,同时解决了我一个疑惑:内存图可以从引用的维度调试问题,但应该如何衔接到Instruments继续研究,毕竟看问题的角度不应该只有一个。
Xcode调试内存最新理解的更多相关文章
- Android学习系列(37)--App调试内存泄露之Context篇(下)
接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...
- Instruments指南:如何调试内存泄露
Instruments指南:如何调试内存泄露 开篇 现在,你应该使用的ARC,而不是原来我们使用的MRC或者其他.但是我们在使用ARC的时候也会出现内存泄露的情况. 幸运的是,苹果为我们提供了Inst ...
- Xcode 调试技巧 --常用命令和断点
Xcode 中的调试技巧与我们的日常开发息息相关,而这些调试技巧在我们解决Bug时,常常有事半功倍的作用,经常会用到的有各种断点 和 命令.而这些调试技巧也经常会在面试中问到,所以不知道的就来看看吧. ...
- Xcode调试LLDB
一.简介 关于Xcode调试,相信大家很多会用断点调试,今天无意间在苹果开发的群里看到了po,瞬间心中有个疑问:po是什么?下面我就百度搜索了一下,介绍一点皮毛. 首先是LLDB,它的全名是lower ...
- IOS调试技巧:当程序崩溃的时候怎么办 xcode调试
转自:http://www.ityran.com/archives/1143 ------------------------------------------------ 欢迎回到当程序崩溃的时候 ...
- 用"僵尸对象"调试内存管理问题
Cocoa提供了"僵尸对象"(Zombie Object)这个功能.启用这项调试功能之后,运行时系统会把所有已经回收的实例转化成特殊的"僵尸对象",而不会真正回 ...
- Mac OS X 10.9 Mavericks安装后,Xcode调试时模拟器黑屏的处理方法
请耐心的等下去吧,少年! 装了Mac OS X 10.9 Mavericks的同学,如果碰到Xcode调试App时,模拟器黑屏(重置也无效),请耐心的等下去吧,大约10来分钟左右黑屏就会消失,App启 ...
- xcode调试打印QString
xcode调试打印QString xcode内置GDB,在调试工程过程中可以通过print命令打印基本的数据类型,但像QString这样复杂类型就不行了.虽然我们可以在程序代码通过添加Qt的调试打印语 ...
- [math] 我对对数的最新理解
前言 作为资深学渣,每次遇到对数就极度恐慌.恐慌不是因为要考试---.而是因为不理解,只能靠死记硬背运算规则.不能进行有效的推理,这让我极度不爽,因为会忘记.故惶恐. 所以总是耿耿于怀,想要试图理解对 ...
- 移动端测试===Android内存管理: 理解App的PSS
Android内存管理: 理解App的PSS 原文链接:http://www.littleeye.co/blog/2013/06/11/android-memory-management-unders ...
随机推荐
- [ML] 数据预处理 - 特性归一化的目的
简而言之,归一化的目的就是使得预处理的数据被限定在一定的范围内(比如[0,1]或者[-1,1]), 从而消除奇异样本数据导致的不良影响. 是否归一化主要在于是否关心变量取值. Tool:ChatAI ...
- [PHP] 浅谈 Laravel Authorization 的 gates 与 policies
首先要区分 Authentication 与 Authorization,认证和授权,粗细有别. 授权(Authorization) 有两种主要方式,Gates 和 Policies. Gates 和 ...
- dotnet 使用 IndentedTextWriter 辅助生成代码时生成带缩进的内容
随着源代码生成的越来越多的应用,自然也遇到了越来越多开发上的坑,例如源代码的缩进是一个绕不过去的问题.如果源代码生成是人类可见的代码,我期望生成的代码最好是比较符合人类编写代码的规范.为了能让人类在阅 ...
- 一个支持Sora模型文本生成视频的Web客户端
大家好,我是 Java陈序员. 最近 Open AI 又火了一把,其新推出的文本生成视频模型 -- Sora,引起了巨大的关注. Sora 目前仅仅只是发布预告视频,还未开放出具体的 API. 今天, ...
- SAP Adobe Form 教程四 动态隐藏和显示字段
前文: SAP Adobe Form 教程一 简单示例 SAP Adobe Form 教程二 表 SAP Adobe Form 教程三 日期,时间,floating field 本文链接:https: ...
- MacOS M1芯片openmp库出现mach-o file, but is an incompatible architecture (have ‘arm64‘, need ‘x86_64‘问题解决
目录 1. 问题描述 2. 问题出现原因 3. 解决方案 编译安装 使用Homebrew安装 Reference 1. 问题描述 报错如下所示: ImportError: dlopen(/Users/ ...
- DNS(3) -- dns常用命令-rndc-dig-host-nslookup
目录 1 bind自带客户端命令 1.1 rndc命令 1.2 检查配置文件语法 2 客户端测试命令 2.1 dig命令 2.2 host命令 2.3 nslookup命令 1 bind自带客户端命令 ...
- 让创意在幻觉中肆虐: 认识Illusion Diffusion AI
人工智能新境界 在不断发展的人工智能领域,一款非凡的新工具应运而生,它能将普通照片转化为绚丽的艺术品.敬请关注Illusion Diffusion,这是一个将现实与想象力完美融合的AI驱动平台,可创造 ...
- [chatGPT]unity中,我希望一个角色有一个链表能获取到场上所有“creature”的transform,当creature增加或减少时刷新这个链表,我该怎么做?
关键字:unity游戏对象管理,unity,unity实例管理,unity触发方法 我 unity中,我希望一个角色有一个链表能获取到场上所有"creature"的transfor ...
- MFC之ListControl选中行删除
if (m_list.GetSelectedCount() > 0) { POSITION pos= m_list.GetFirstSelectedItemPosition(); while ( ...