草庐IT

iOS 底层原理39:Instruments系列(一)Instruments介绍

Style_月月 2023-03-28 原文

前言

通常程序运行时常见的错误大致分为两类

  • 用户使用引起的外部错误,例如缺少参数、参数错误等

  • 程序运行时产生的内部错误,例如内存溢出、空指针、以0做除数等

针对第一种外部错误,一般是不可控的,因为用户的行为是随机的,所以一般只能采取相应的预防措施,尽最大程度去避免这类问题

针对第二种内部错误,可以通过一些工具及时的找出问题并修正。这里就不得不提及Xcode自带的检测调试工具Instruments了。

介绍

Instruments是一个非常灵活、且强大的工具,可以进行性能分析、动态追踪、代码分析等,让我们对程序的内部运行更加了解。主要可以做以下事情:

  • 用于动态调追踪和分析OS X和iOS的代码的性能分析和测试工具

  • 支持多线程调试

  • 支持录制和回放图形界面的操作过程

  • 追踪代码中的问题(甚至是难以复现的)

  • 分析程序的性能

  • 实现程序的自动化测试

  • 部分实现程序的压力测试

  • 执行系统级别的通用问题最终调试

打开方式有以下三种:

  • 快捷键:CMD + I(对应小写的i)

  • Xcode -> Open Developer Tool -> Instruments

  • 项目 -> Product -> Profile

Instruments具体的界面如下所示


Instruments界面
  • Blank:创建一个空的模板,可以自定义添加各种工具

  • Activity Monitor:跟踪整个系统的活动,包括 CPU、内存、网络和磁盘。默认情况下,活动监视器模板不会在时间线窗格中显示网络或磁盘活动

  • Allocations:使用Allocations和VM Tracker工具来测量应用程序中的常规和虚拟内存使用情况

  • Animation Hitches:用于检测滚动和动画问题,以帮助您可视化和研究应用程序的图形管道。通俗来讲就是检测界面流畅度,是否有卡顿情况

  • App Launch:使用 5 秒时间配置文件和线程状态跟踪调整应用程序启动性能

  • Core Data:可以检测应用程序中数据的存储交互,例如数据提取、缓存缺失和存储等

  • CPU Counters:收集使用时间或基于事件的抽样方法的性能监控计数器(PMC)事件,使用 Counters 工具来跟踪 PMC 事件。

  • CPU Profiler:用于分析 CPU 工作负载的基于周期的分析器,使用硬件性能监控中断(PMI)来提供更稳定的测量,无论代码是在性能 CPU 还是效率 CPU 上运行

  • File Activity:用于检查系统文件的使用情况,可以检查文件的打开、关闭、读和写操作,同时也可以检测文件系统本身的改变,包括权限和所有权发生的改变。

  • Game Performance:用于检测游戏性能和帧率

  • Leaks:用来检测内存的泄漏

  • Logging:来自统一日志系统的日志和路标的可视化。用于导入日志存档文件的默认模板

  • Metal System Trace:是apple 2014年在ios平台上推出的高效底层的3D图形API,它通过减少驱动层的API调用CPU的消耗提高渲染效率。

  • Network:使用连接工具来分析iOS应用程序的TCP/IP和UDP/IP连接

  • SceneKit:检测的app是使用了screenKit。用于确定每一帧的工作类型,例如动画、物理、场景剔除和渲染。

  • SwiftUI:SwiftUI分析工具,用于跟踪视图类型的 .body 调用、动态视图属性随时间的更新以及识别慢帧

  • System Trace:操作系统中事件发生的全视图。了解线程是如何跨 CPU 调度的,并了解系统调用和虚拟内存故障如何影响应用程序的性能

  • Time Profiler:使用时间分析器工具对系统CPU上运行的进程执行低开销、基于时间的采样。随着时间的推移,多核和线程的使用效率越高,应用程序的性能就越好。时间分析器工具中的CPU和线程策略显示了应用程序对内核和线程的利用程度。

  • Zombies:使用分配工具来测量应用程序中的一般内存使用情况,重点是检测过度释放的“zombie”对象,即在释放后调用的对象,这些对象不再存在。

其中常用的是以下几种,后续会分别介绍如何使用及自定义

  • Allocation

  • Animation Hitches

  • App Launch

  • Leaks

  • Network

  • Time Profiler:

  • Zombies

有关iOS 底层原理39:Instruments系列(一)Instruments介绍的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  4. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  5. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  6. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  7. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  8. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  9. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  10. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

随机推荐