前提:

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调试内存最新理解的更多相关文章

  1. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

  2. Instruments指南:如何调试内存泄露

    Instruments指南:如何调试内存泄露 开篇 现在,你应该使用的ARC,而不是原来我们使用的MRC或者其他.但是我们在使用ARC的时候也会出现内存泄露的情况. 幸运的是,苹果为我们提供了Inst ...

  3. Xcode 调试技巧 --常用命令和断点

    Xcode 中的调试技巧与我们的日常开发息息相关,而这些调试技巧在我们解决Bug时,常常有事半功倍的作用,经常会用到的有各种断点 和 命令.而这些调试技巧也经常会在面试中问到,所以不知道的就来看看吧. ...

  4. Xcode调试LLDB

    一.简介 关于Xcode调试,相信大家很多会用断点调试,今天无意间在苹果开发的群里看到了po,瞬间心中有个疑问:po是什么?下面我就百度搜索了一下,介绍一点皮毛. 首先是LLDB,它的全名是lower ...

  5. IOS调试技巧:当程序崩溃的时候怎么办 xcode调试

    转自:http://www.ityran.com/archives/1143 ------------------------------------------------ 欢迎回到当程序崩溃的时候 ...

  6. 用"僵尸对象"调试内存管理问题

    Cocoa提供了"僵尸对象"(Zombie Object)这个功能.启用这项调试功能之后,运行时系统会把所有已经回收的实例转化成特殊的"僵尸对象",而不会真正回 ...

  7. Mac OS X 10.9 Mavericks安装后,Xcode调试时模拟器黑屏的处理方法

    请耐心的等下去吧,少年! 装了Mac OS X 10.9 Mavericks的同学,如果碰到Xcode调试App时,模拟器黑屏(重置也无效),请耐心的等下去吧,大约10来分钟左右黑屏就会消失,App启 ...

  8. xcode调试打印QString

    xcode调试打印QString xcode内置GDB,在调试工程过程中可以通过print命令打印基本的数据类型,但像QString这样复杂类型就不行了.虽然我们可以在程序代码通过添加Qt的调试打印语 ...

  9. [math] 我对对数的最新理解

    前言 作为资深学渣,每次遇到对数就极度恐慌.恐慌不是因为要考试---.而是因为不理解,只能靠死记硬背运算规则.不能进行有效的推理,这让我极度不爽,因为会忘记.故惶恐. 所以总是耿耿于怀,想要试图理解对 ...

  10. 移动端测试===Android内存管理: 理解App的PSS

    Android内存管理: 理解App的PSS 原文链接:http://www.littleeye.co/blog/2013/06/11/android-memory-management-unders ...

随机推荐

  1. Pod进阶篇:污点-容忍度-亲和性-Affinity-调度(5)

    一.Pod资源清单详细解读 apiVersion: v1 #版本号,例如 v1 kind: Pod #资源类型,如 Pod metadata: #元数据 name: string # Pod 名字 n ...

  2. 003_Orcad菜单讲解与偏好设置

    003_Orcad菜单讲解与偏好设置 菜单栏用的比较多的是File和Options项. 网格建议用lines,比较方便对齐. Auto Reference和Intertool Commuication ...

  3. 【2023微博签到爬虫】用python爬上千条m端微博签到数据

    一.爬取目标 大家好,我是 @马哥python说,一枚10年程序猿. 今天分享一期python爬虫案例,爬取目标是新浪微博的微博签到数据,字段包含: 页码,微博id,微博bid,微博作者,发布时间,微 ...

  4. shell 去掉逗号_shell替换和去掉换行符

    用shell处理文件的时候我们常常需要去掉或者加上换行符,name问题就来了怎么才能快速的替换呢? 我们有这样一个文件[root@hxy working]# cat 1 GD200A16C013493 ...

  5. SpringBoot模拟插入1000000万条数据

    一.数据库表准备 CREATE TABLE `student` ( `id` bigint NOT NULL COMMENT '用户id', `name` varchar(50) COLLATE ut ...

  6. Ubuntu 一直卡在开机界面或者用户登录界面死循环问题的解决

    此方法并不全部通用,根据自己实际情况 建议提前快照再试试此方法 原因:NVIDIA 驱动所致,之前安装方式nvidia驱动出问题. 解决办法:卸载nvidia驱动,重新安装. (1)进入文本模式:CT ...

  7. Arrays类的常用方法

    Arrays类的常用方法 Array数组的工具类java.util.Arrays Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而不用使用对象来调用 Ar ...

  8. HDU-Employment Planning题解

    题目在这里 -------------------------------- Employment Planning 简单的一道dp 关键的点在于想到用枚举实现各种情况的讨论 关键的注释写在代码里了 ...

  9. URP(Universal Render Pipeline)渲染管线在使用中的一些分享

    本篇文章整理了URP管线使用中的一些简单的心得记述 1.使用ScriptableRendererFeature自定义渲染特性 在内建(Build-in)管线中可以使用CommandBuffer并添加到 ...

  10. xlwings模块详解

    中文文档:https://www.kancloud.cn/gnefnuy/xlwings-docs/1127454 import xlwings#查找包路径print(xlwings.__path__ ...