前提:

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. 2018-11-19-win10-uwp-使用-Azure-DevOps-自动构建

    title author date CreateTime categories win10 uwp 使用 Azure DevOps 自动构建 lindexi 2018-11-19 15:26:4 +0 ...

  2. 全网最详细SpringCloud-高级篇

    SpringCloud-高级篇 高级篇包含微服务保护(流量控制,系统保护,熔断降级,服务授权).分布式事务.多级缓存.Redis集群.可靠消息服务 学习安排 技术分类 1.微服务保护 ①初识Senti ...

  3. 11个Python循环技巧

    本文分享自华为云社区<Python中的循环技巧指南>,作者:柠檬味拥抱. 当我们处理数据时,有时候需要创建多个列表以存储不同类型或不同条件下的数据.在Python中,我们可以利用循环来快速 ...

  4. C#使用MX Component实现三菱PLC软元件数据采集的完整步骤(仿真)

    前言 本文介绍了如何使用三菱提供的MX Component插件实现对三菱PLC软元件数据的读写,记录了使用计算机仿真,模拟PLC,直至完成测试的详细流程,并重点介绍了在这个过程中的易错点,供参考. 用 ...

  5. NumPy 数组创建方法与索引访问详解

    NumPy 创建数组 NumPy 中的核心数据结构是 ndarray,它代表多维数组.NumPy 提供了多种方法来创建 ndarray 对象,包括: 使用 array() 函数 array() 函数是 ...

  6. Django高级表单处理与验证实战

    title: Django高级表单处理与验证实战 date: 2024/5/6 20:47:15 updated: 2024/5/6 20:47:15 categories: 后端开发 tags: D ...

  7. Fiddler在抓取https数据包时如何解决Tunnel to 443的问题?

    学习视频: https://www.bilibili.com/video/BV1zg4y1i7k3?p=2 谷歌浏览器导入证书 1.导出证书到桌面 2.双击安装证书 3.浏览器-->设置--&g ...

  8. Linux中的man page指令

    以Linux上的date命令为例,在控制台输入 man date,将会展示如下界面: [vbird@www ~]$ man date DATE(1) User Commands DATE(1) # 请 ...

  9. ansible系列(28)--ansible的playbook异常处理

    目录 1. playbook的异常处理 1.1 Playbook错误忽略 1.2 task执行失败强制调用handlers 1.3 控制Tasks报告状态为OK 1.4 changed_when检查任 ...

  10. java程序,如何打印详细报错堆栈信息

    try { System.out.println(1/0); } catch (final Exception e) { log.error("ERROR", "Erro ...