首页 > 系统相关 >Xcode调试内存最新理解

Xcode调试内存最新理解

时间:2024-06-22 16:43:26浏览次数:13  
标签:选项 Xcode 内存 debug 方法 调试

前提:
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,内存,debug,方法,调试
From: https://www.cnblogs.com/MrYU4/p/18262471/xcode-tiao-shi-nei-cun-zui-xin-li-jie

相关文章

  • python3使用pyVmomi获取vCenter中虚拟机cpu/内存信息
    原创文档编写不易,未经许可请勿转载。文档中有疑问的可以邮件联系我。邮箱:[email protected]说明文章分享在Linux操作系统中安装python3环境,并通过pyVmomi获取vCenter中运行的虚拟机信息,最后把获取的虚拟机数据存储到数据库中。前三章为基础环境构建,第四章为脚本代码。环境软......
  • linux结束处于Tl状态的进程,释放内存资源
    原因是运行python结束时,用的ctrl+c不太行,尝试Ctrl+z,发现有时候管用。后面htop一看内存似乎没有释放掉。总结针对处在Tl状态的进程,用kill进程号没用,内存没有释放掉、进程没有关掉。用kill-CONT进程号解决,原理是发现SIGCONT信号,激活进程,然后就可以关掉了,内存也释放掉......
  • Python高效内存访问,memoryview这个神器你值得拥有!
    目录1、初识memoryview......
  • stm32 sai 接口调试总结
    一概念STM32的新片子的音频外设叫SAI了,S就是Serial,A就是Audio,I就是Interface,还是挺好记的.究竟新在哪里,就是支持音频各种了,但是实际上用到的,基本上还都是I2S居多。这里给出I2S的stm32配置做一个总结。二参数配置1.接口和时钟配置图: 2.源码解析......
  • 记一次https通讯调试过程
    情况说明:和服务端https交互时,用域名的方式会有正常的应答,用指定IP的方式则提示异常。代码抛出异常如下:javax.net.ssl.SSLHandshakeException:Remotehostclosedconnectionduringhandshakeatcom.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl,java:88......
  • STM32三种调试工具CMSIS-DAP、J-Link和ST-Link
    一.概述CMSIS-DAP、J-Link和ST-Link均是嵌入式处理器的开发调试工具。CMSIS-DAP是一种轻量级调试接口,旨在实现开源的开发调试。它的优点是使用方便、通用性好、成本低,还支持固件的在线升级。J-Link是一款由德国公司SEGGERMicrocontroller开发的高性能调试工具。但是价格较......
  • CM3调试系统简析
    CM3调试系统简析**“一直以来,单片机的调试一直不是很突出的主题,很多简单些的程序在开发中,甚至都没有调试的概念,而只是把生成的映像直接烧入片子,再根据错误症状来判断问题,然后修改程序重新烧,周而复始,直到问题解决或放弃为止。”**—《Cortex-M3权威指南》大部分初学者......
  • 深入理解和实现Windows进程间通信(共享内存)
    常见的进程间通信方法常见的进程间通信方法有:管道(Pipe)消息队列共享内存信号量套接字下面,我们将详细介绍共享内存的原理以及具体实现。什么是共享内存?Windows共享内存(SharedMemoryinWindows)是一种操作系统机制,允许不同的进程(程序)共享一段内存空间。这意味着多个进......
  • Fiddler 是一个功能强大的网络调试工具,通过掌握其高级功能,您可以更深入地进行流量分析
    Fiddler是一个功能强大的网络调试工具,主要用于捕获、检查和修改HTTP请求和响应。以下是一个Fiddler初级应用的大纲,帮助你快速了解如何使用它进行网络调试和分析:1. 安装和基本设置下载和安装Fiddler。启动Fiddler,并了解主界面的基本布局。配置浏览器或应用程序以使用......
  • java object多大 java对象内存模型 数组有多长(九)多线程2
    背景:多线程与单线程byte模式有误差,而且多线程每次跑出来不一样 发现:set多线程单线程没有误差,意味着除了byte那一块代码,其他的代码是可被信任的单线程5000以下byte没有hash冲突时==单线程set==apache==理论值;基本证明了这套cas在单线程下没问题;hash冲突是导致单线程set和单线......