Instruments 用户指南php
http://cdn.cocimg.com/bbs/attachment/Fid_6/6_24457_90eabb4ed5b3863.pdfweb
原著:Apple Inc. 翻译:謝業蘭【老狼】 联系:xyl.layne@gmail.com 鸣谢:有米移动广告平台编程
CocoaChina 社区数组
Instruments User Guide浏览器
目录缓存
INSTRUMENTS用户指南............................................................................................................................... I INSTRUMENTS用户指南介绍...................................................................................................................... 2ruby
本文档组织结构.................................................................................................................... 2 第一章 INSTRUMENTS快速入门 ......................................................................................................... 4服务器
1.1 启动INSTRUMENTS ..................................................................................................... 5网络
1.2 建立一个跟踪文档.................................................................................................... 5数据结构
1.3 浏览跟踪文档窗口.................................................................................................... 7
1.4 示例:快速使用一个跟踪...................................................................................... 10
1.5 下一步是什么?...................................................................................................... 10
第二章 添加和配置INSTRUMENTS工具............................................................................................11
2.1 使用INSTRUMENT库................................................................................................. 11
2.1.1 修改库试图模式 ........................................................................................... 12
2.1.2 查找库里面的某个instrument工具 .............................................................. 13
2.1.3 新建一个自定义的instrument分组 .............................................................. 15
2.2 添加和删除INSTRUMENTS工具 ............................................................................... 20
2.3 配置一个INSTRUMENT工具..................................................................................... 21
第三章 记录跟踪数据 ............................................................................................................................ 23
3.1 选择须要跟踪的进程.............................................................................................. 23
3.1.1 跟踪全部进程 ............................................................................................... 23
3.1.2 跟踪一个已有的进程 ................................................................................... 24
3.1.3 跟踪一个新的进程 ....................................................................................... 24
3.1.4 给每一个Instrument工具指定不一样的目标 ...................................................... 26
3.2 收集数据.................................................................................................................. 26
3.3 使用快速启动键启动INSTRUMENTS ....................................................................... 27
3.4 以最小模式运行...................................................................................................... 28
3.5 从XCODE运行INSTRUMENTS应用 ........................................................................... 29
3.6 无线链接IOS设备 ................................................................................................... 29
第四章 记录用户界面轨迹 .................................................................................................................... 32
4.1 记录用户界面轨迹.................................................................................................. 32
4.2 重复记录用户界面轨迹.......................................................................................... 33
4.3 回放用户界面轨迹.................................................................................................. 34
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [1]
Instruments User Guide
第五章 查看和分析跟踪数据 ................................................................................................................ 36
5.1 查看数据的工具...................................................................................................... 36
5.1.1 跟踪面板 ....................................................................................................... 36
5.1.2 详细面板 ....................................................................................................... 41
5.1.3 扩展详细面板 ............................................................................................... 44
5.1.4 运行浏览器 ................................................................................................... 46
5.2 分析技术.................................................................................................................. 47
5.2.1 使用Sampler Instrument分析数据................................................................ 47
5.2.2 使用Allocations Instrument工具分析数据................................................... 49
5.2.3 查找内存泄露 ............................................................................................... 53
5.2.4 分析Core Data应用程序............................................................................... 54
第六章 保存和导入跟踪数据 ................................................................................................................ 55
6.1 保存跟踪文档.......................................................................................................... 55
6.2 导出跟踪数据.......................................................................................................... 55
6.3 从SAMPLE工具中导入数据..................................................................................... 56
6.4 使用DTRACE数据.................................................................................................... 56
第七章 使用DTRACE建立自定义INSTRUMENTS工具 .................................................................. 57
7.1 关于自定义INSTRUMENTS工具 ............................................................................... 57
7.2 建立自定义的INSTRUMENT工具............................................................................. 58
7.2.1 添加和删除探针 ........................................................................................... 60
7.2.2 指定探针的提供者 ....................................................................................... 60
7.2.3 给探针添加断言 ........................................................................................... 61
7.2.4 给探针添加动做 ........................................................................................... 63
7.2.5 编写自定义脚本的提示 ............................................................................... 65
7.2.6 编写BEGIN和END脚本............................................................................... 65
7.2.7 从自定义脚本里面访问内核数据 ............................................................... 66
7.2.8 变量做用域 ................................................................................................... 67
7.2.9 查找脚本错误 ............................................................................................... 67
7.3 导出DTRACE脚本.................................................................................................... 68
第八章 内置INSTRUMENTS工具 ....................................................................................................... 69
8.1 CORE DATA INSTRUMENTS[CORE DATA相关] .......................................................... 69
8.1.1 Core Data Saves ............................................................................................ 69
8.1.2 Core Data Fetches ......................................................................................... 70
8.1.3 Core Data Faults ............................................................................................ 70
8.1.4 Core Data Cache Misses................................................................................ 71
8.2 DISPATCH INSTRUMENTS[并发相关]........................................................................ 72
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [2]
Instruments User Guide
8.2.1 Dispatch......................................................................................................... 73
8.3 ENERGY DIAGNOSITICS INSTRUMENTS[电池诊断相关] .......................................... 75
8.3.1 电量使用(Energy Usage)......................................................................... 76
8.3.2 CPU 活动(CPU Acitivity)....................................................................... 76
8.3.3 显示亮度(Display Brightness)................................................................. 77
8.3.4 休眠/唤醒(Sleep/Wake) ........................................................................... 77
8.3.5 蓝牙(Bluetooth) ....................................................................................... 77
8.3.6 无线(WiFi) ............................................................................................... 77
8.3.7 定位(GPS)................................................................................................ 78
8.4 FILE SYSTEM INSTRUMENTS[文件系统相关] .......................................................... 78
8.4.1 I/O 活动(I/O Activity) .................................................................................. 78
8.4.2 文件锁(File Locks) ....................................................................................... 81
8.4.3 文件属性(File Attributes) ............................................................................. 81
8.4.4 文件活动(File Activity) ........................................................................... 82
8.4.5 目录I/O(Directory I/O) ............................................................................ 83
8.5 GARBAGE COLLECTION INSTRUMENTS[垃圾回收相关] .......................................... 84
8.5.1 GC Total ........................................................................................................ 84
8.5.2 垃圾回收(Garbage Collection)................................................................ 85
8.6 GRAPHICS INSTRUMENTS[绘图相关] ....................................................................... 86
8.6.1 核心动画(Core Animation) ..................................................................... 86
8.6.2 OpenGL驱动器(OpenGL Driver)............................................................ 87
8.6.3 OpenGL ES驱动器(OpenGL ES Driver)................................................. 87
8.6.4 OpenGL ES分析器(OpenGL ES Analyzer)............................................. 89
8.7 INPUT/OUTPUT INSTRUMENTS[输入输出相关] ....................................................... 90 8.7.1 读/写(Reads/Wirtes)................................................................................. 90
8.8 MASTER TRACKS INSTRUMENTS[界面操做跟踪相关] ............................................ 91 8.8.1 用户界面(User Interface) ........................................................................ 91
8.9 MEMORY INSTRUMENTS[内存相关] ........................................................................ 91
8.9.1 共享内存(Shared Memory) ..................................................................... 91
8.9.2 分配内存(Allocations)............................................................................. 92
8.9.3 内存泄露(Leaks) ..................................................................................... 94
8.10 SYSTEM INSTRUMENTS[系统相关] .......................................................................... 95
8.10.1 时间分析器(Time Profiler)...................................................................... 95
8.10.2 旋转监控器(Spin Monitor)...................................................................... 96
8.10.3 取样(Sampler).......................................................................................... 97
8.10.4 进程(Process)........................................................................................... 98
8.10.5 网络活动监控器(Network Activity Monitor) ......................................... 99
8.10.6 内存监控器(Memory Monitor) ............................................................... 99
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [3]
Instruments User Guide
8.10.7 硬盘监控器(Disk Monitor) ..................................................................... 99
8.10.8 CPU监控器(CPU Monitor) ................................................................... 100
8.10.9 活动监控器(Activity Monitor) .............................................................. 100
8.11 THREADS/LOCKS INSTRUMENTS[线程相关] .......................................................... 100 8.11.1 Java线程(Java Thread)........................................................................... 100
8.12 UI AUTOMATION[界面自动化相关] ...................................................................... 101
8.12.1 使用Automation Instrument工具................................................................ 101
8.12.2 访问和操做用户界面元素 ......................................................................... 104
8.12.3 添加灵活的超时间 ......................................................................................113
8.12.4 验证测试结果..............................................................................................114
8.12.5 输出测试结果和数据的日子 ......................................................................114
8.12.6 处理警告......................................................................................................115
8.12.7 检测和指定设备的方向 ..............................................................................116
8.12.8 测试多任务..................................................................................................118
8.13 USER INTERFACE INSTRUMENTS[用户界面相关] .................................................. 118
8.13.1 Cocoa事件(Cocoa Events)......................................................................118
8.13.2 Carbon事件(Carbon Events)...................................................................119
结束语........................................................................................................................................................... 120 推荐资源....................................................................................................................................................... 121
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [4]
Instruments User Guide
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [1]
Instruments User Guide
Instruments用户指南介绍
Instruments 是应用程序用来动态跟踪和分析 Mac OS X 和 iOS 代码的实用工具。 这是一个灵活而强大的工具,它让你能够跟踪一个或多个进程,并检查收集的数据。 这样,Instruments 能够帮你更好的理解应用程序和操做系统的行为。
使用 Instruments 应用,你能够使用特殊的工具(即 instruments 工具)来跟踪同 一进程不一样方面的行为。你也能够使用该应用来记录一系列用户界面的动做并响应它 们,同时也能够使用一个或多个 instruments 工具来收集数据。
Instruments 应用包含如下功能:
分析一个或多个进程的行为
记录一系列用户的动做并响应它们,可靠的再现这些事件并收集屡次运行的
数据
建立你本身自定义的 DTrace instruments 来分析系统和应用程序的行为
保存用户界面记录和instruments的配置为模板,并从Xcode里面访问 使用 Instruments,你能够:
追查代码中难以重现的问题
对你的程序进行性能分析
自动化测试你的代码
对你程序进行压力测试
进行通常的系统级故障诊断
对你的代码如何工做有更深刻的了解
Instruments 在 Xcode 3.0 和 Mac OS X 10.5 及其以后可用。
本文档描述了 Instruments 的用户界面,给出了一个如何使用 Instruments 来跟
踪进程和查看数据的预留。目的是让开发人员和系统管理员使用 Instruments 能更好 的了解他们程序或系统做为一个总体的行为。
本文档组织结构 如下章节描述了如何使用 Instruments 应用:
“Instruments快速入门”给出了Instruments的概要预览,并介绍了主体窗 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [2]
Instruments User Guide
口。
“添加和配置Instruments”描述了如何添加和配置instruments工具,以及
在一个或多个进程里面运行它们收集数据。本章还介绍如何对程序进行选择
行跟踪。
“记录跟踪数据”描述了如何初始化跟踪并收集跟踪数据的方法。
“记录用户界面轨迹”描述如何记录和重放一系列有顺的用户操做。
“查看和分析跟踪数据”描述了用来查看Instruments返回数据的工具。
“保存和导入跟踪数据”描述了如何保存跟踪文档和数据,以及如何从其余
来源导入数据。
“使用DTrace建立自定义工具”显示了如何建立和配置基于DTrace的自定义
工具。
“内置的instruments工具”详细介绍了Instruments内置的工具。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [3]
Instruments User Guide
第一章 Instruments快速入门
Instruments 是一个很强大的工具,你能够用它来收集关于一个或多个系统进程 的性能和行为的数据,并跟踪随着时间产生的数据。不像其余大部分性能和调试工具 那样,Instruments 让你能够普遍收集不一样类型的数据,而且能够一边查看它们。这 样你能够发现变化趋势,这在其余工具里面是很难作到的。好比,你以前须要采样程 序的样本,并分析它们在两个独立的执行文件里面运行的内存行为。在 Instruments 里面,你能够同时完成这些工做。你能够用这些结果数据来发现你代码中正在运行部 分的变化趋势和它们的内存使用状况。
Instruments 应用使用 instruments 工具来收集关于进程随时间推移产生的数 据。每一个 instruments 收集和显示不一样类型的数据,好比文件访问、内存使用等等。 Instruments 包括一个标准 instruments 工具库,你能够使用它分析你代码的不少方 面。你能够配置 instruments 来收集关于同一个或者不一样系统进程的数据。你能够使 用自定义的 instruments 工具新建接口来建立新的自定义 instruments 工具,它使用 DTrace 程序来收集你想要的数据。
注意:很多应用程序(iTunes、DVD Player 和 Front Row,还有使用 QuickTime 的应用)为了保 护敏感数据,不容许使用 DTrace 来收集数据(不管暂时的仍是永久的)。
全部 Instruments 的工做都在一个跟踪文档(trace documents)里面完成。一 个跟踪文档收集那些被 instruments 汇集的与该文档有关的数据。每一个跟踪文档一般 包含一个会话的价值数据,这也是做为一个单一的跟踪。你能够保存跟踪文档到你已 经收集的跟踪数据备份里面,而后能够在之后再次打开并查看它们。
尽管大部分的 instruments 工具旨在收集数据,可是其中最精密的 instruments 工具能够帮助自动化收集数据。使用 Instruments User Interface 工具,你能够在 收集数据的过程当中记录用户事件。你能够使用这些数据来可靠的重复重现这一系列有 序的事件。每次你经过这序列运行,你的跟踪文档在其余 instruments 工具里面收集 新的跟踪数据,而且和以前同样边收集边显示这些数据。这些特性让你比较跟踪的数 据来提升你的代码,并验证你的改动得到预期的结果。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [4]
Instruments User Guide
1.1 启动Instruments
Instruments 做为 Xcode 工具安装的一部分。有几个启动 Instruments 的方法:
你能够在Finder里面双击Instruments应用的图标来启动它。Instruments应用
位于<Xcode>/Applications 目录下面,<Xcode>表明你 Xcode 安装的根路径。
(Xcode 默认的安装根路径时 /Developer 目录。)
你能够经过Xcode来启动Instruments,并把你工程下的可执行文件做为它的目
标。在 Xcode 的菜单里面选择 Run > Start with Performance Tool 来选择 Instruments 模板(注:在 Xcode 4.0 以上已经无此方法,你须要经过 Profile 来启动,更多请 Google 一下)。Instruments 以特定的模板启动,而且准备好运 行 Xcode 配置的当前可执行文件。
注意:当你以这种方式来启动一个 Instruments 模板的时候,在完成跟踪以后,你必须显示 的中止你当前的执行文件(不管是从程序里面仍是从 Instruments 里面)。这不会关闭 Instruments 的跟踪文档。相反,你能够重启可执行文件,Instruments 显示旧的对话框旁 边显示新的对话框,就如图 4-2 显示那样。这样可让你在 Xcode 里面修改你的代码,从新 编译,运行和比较新的改变产生的跟踪数据。
你能够经过双击一个Instruments的模板文件或者跟踪文档来启动它。查看”保 存和导入跟踪数据”部分来掌握如何保存一个 Instruments 的配置文件或者使用 用户界面记录做为一个模板文件。
1.2 建立一个跟踪文档
当你启动 Instruments 后,应用会自动为你建立一个文档。你一样能够经过选择 File > New 来建立一个新的文档。
你每建立一个新的文档,Instruments 都会提示你选择一个开始模板。这些模板 定义了一些你将要在你的跟踪文档里面使用的 instruments 工具集。Instruments 提 供了几种不一样的模板,在表 1-1 里面列举出来,每一个模板都有不一样的使用目的。若是 你手工的给你的跟踪文档添加一个指定的 instruments 工具的话,你能够使用空白模 板。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [5]
Instruments User Guide
Table 1-1 Instruments starting templates
Template
Type
Description
Creates an empty trace document to which you can add your own combination of instruments. To learn how to select and add instruments, see “Adding and Configuring Instruments.” For descriptions of the individual
Blank
Mac OS X, iOS, iOS
Simulator,
User
built-in instruments, see “Built-in Instruments.”
Mac OS X, iOS, iOS
Activity |
Monitor |
Simulator
Adds the Activity Monitor instrument to your document. Use this template if
you want to correlate the system workload with the virtual memory size.
Mac OS X, iOS, iOS
Adds the Allocations and VM Tracker instruments to your document. Use this template to monitor memory and object-allocation patterns in your program.
Allocations
Simulator
(To use this template, you must launch your process from Instruments.)
iOS, iOS
Adds the Automation instrument to your document. Use this template to
Automation
Simulator
automate user interface tests of your iOS application.
Core
Adds the Core Animation and Sampler instruments to your document. Use this template to measure the number of Core Animation frames per second in a process running on an iOS device, and to see visual hints that help you
iOS
Animation
understand how content is rendered on the screen.
Adds the Core Data Fetches, Core Data Cache Misses, and Core Data Saves instruments to your document. Use this template to monitor data store
Core Data
Mac OS X
interactions in a Core Data application.
CPU
Mac OS X, iOS, iOS
Adds the Sampler and CPU Monitor instruments to your document. Use this template if you want to correlate the overall system workload with the work
Sampler
Simulator
being done specifically by your application.
Adds the Dispatch instrument to your document. Use this template if you want to capture information about GCD queues created by your application
Dispatch
Mac OS X
and about the block objects executing on these queues.
Adds the Energy Diagnostics, CPU Activity, Display Brightness, Sleep/Wake, Bluetooth, WiFi, and GPS instruments to your document. Use this template
Energy
iOS
Diagnostics
to get diagnostic information regarding energy usage in iOS devices.
Adds the File Activity, Reads/Writes, File Attributes, and Directory I/O instruments to your document. Use this template if you want to examine file usage patterns in the system. This combination of instruments monitors open, close, read, and write operations on files and also monitors changes in
Mac OS X, |
iOS Simulator |
File Activity
the file system itself, including permission and owner changes.
Adds the ObjectGraph, Allocations, and Garbage Collection instruments to your document. Use this template to measure the data reclaimed in the
GC Monitor
Mac OS X
scavenge phase of the garbage collector.
Adds the Allocations and Leaks instruments to your document. Use this template to monitor memory usage in your application and to detect memory leaks. (To use this template, you must launch your process from
Mac OS X, iOS, iOS
Leaks
Simulator
Instruments.)
Adds the Thread States and Dispatch instruments to your document. Use this template to analyze multicore performance, including thread state,
Multicore
Mac OS X
dispatch queues, and block usage.
OpenGL ES
Adds the OpenGL ES Analyzer and OpenGL ES Driver instruments to your document. Use this template to measure OpenGL ES activity and get
iOS
Analysis
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [6]
Instruments User Guide
![]() recommendations for addressing problems. |
||||
![]() OpenGL ES ![]() Driver |
iOS |
![]() Adds the OpenGL ES Driver and Sampler instruments to your document. Use this template to determine how efficiently you’re using OpenGL and the ![]() GPU on iOS devices. |
||
![]() Sudden ![]() Termination |
Mac OS X |
![]() Adds the Sudden Termination and Activity Monitor instruments to your document. Use this template to analyze sudden termination support. It reports unprotected file-system access the target process should be, but is not, guarding with calls to disable sudden termination. It also provides activity monitoring across all processes, including sudden termination status ![]() for each. |
||
![]() System ![]() Usage |
iOS |
![]() Adds the I/O Activity instrument to your document. Use this template to record calls to functions that operate on files in a process running on an iOS ![]() device. |
||
Threads |
|
![]() Adds the Thread States instrument to your document. Use this template to analyze thread state transitions within a process, including running and ![]() terminated threads, thread state, and associated backtraces. |
||
Time Profiler |
![]() Mac OS X, iOS, iOS ![]() Simulator |
![]() Adds the Time Profiler instrument to your document. Use this template to ![]() perform low-overhead time-based sampling of one or all processes. |
||
UI Recorder |
Mac OS X |
![]() Adds the User Interface instrument to your document. Use this template as a starting point for recording a series of user interactions with your application. You can use this feature to reproduce a series of events multiple times, gathering a new set of data during each successive run. You can then compare the sets of data knowing that the behavior that generated them was identical. Typically, you would start with this template and add additional ![]() instruments to your document to gather data. |
||
Zombies |
|
![]() ![]() Adds the Allocations instrument to your document. Use this template to measure general memory usage while focusing on the detection of ![]() over-released "zombie" objects. |
若是你不想让 Instruments 在你新建一个文档的时候询问你使用那个模板,你可 以在 Instruments 的偏好设置里面勾选 Suppress template chooser 选项来禁止模板 选择。关于更多在 Instruments 文档里面添加和配置 instrumtns 工具的的信息,参 阅“添加和配置 Instruments”部分。
1.3 浏览跟踪文档窗口
跟踪文档本身包含一个收集和分析数据的空间。你使用这些文档来组织和配置你 须要用来收集数据的 instruments 工具,而且能够使用这些文档来查看你已经收集的 高级和低级的数据。
图 1-1 显示了典型的跟踪文档。一个跟踪文档窗口显示不少信息,因此须要很好 的组织。正如你使用跟踪文档来工做同样,信息流从左到右。在你的文档窗口里面,
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [7]
Instruments User Guide
越右边的窗口数据越详细。表 1-2 提供了该窗口关键区域的介绍。
Figure 1-1 The Instruments window while tracing
表 1-2 列出了图 1-1 中显示的关键特性,并提供了一个更深刻使用这些特性的讨 论。
Table 1-2 Trace document key features
Feature
Description
This pane holds the instruments you want to run. You can drag instruments into this pane or delete them. You can click the inspector button in an instrument to configure its data display and gathering parameters. To learn more about instruments, see“Adding and Configuring
Instruments
pane
Instruments.”
The track pane displays a graphical summary of the data returned by the current instruments. Each instrument has its own “track,” which provides a chart of the data collected by that instrument. The information in this pane is read-only. You do use this pane to select specific data points you want to examine more closely, however. The track pane is described in more
Track pane
detail in “The Track Pane.”
The Detail pane shows the details of the data collected by each instrument. Typically, this pane displays the explicit set of “events” that were gathered and used to create the graphical view in the track pane. If the current instrument allows you to customize the way detailed data is displayed, those options are also listed in this pane. For more information about this pane,
Detail pane
see “The Detail Pane.”
The Extended Detail pane shows even more detailed information about the item currently selected in the Detail pane. Most commonly, this pane displays the complete stack trace, timestamp, and other instrument-specific data gathered for the given event. The Extended
Extended
Detail pane
Detail pane is described in “The Extended Detail Pane.”
Navigation
The navigation bar shows you where you are and how you got there. It includes two
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [8]
Instruments User Guide
bar |
![]() ![]() ![]() menus—the active instrument menu and the detail view menu. You can click entries in the navigation bar to select the active instrument and the level and type of information in the ![]() detail view. |
跟踪文档的工具栏(toolbar)可让你增长和控制 instruments 工具,打开视
图,并配置跟踪面板。图 1-2 标示了这些工具栏中不一样的控件,在表 1-3 里面提供了
如何使用这些控件的详细说明。
Figure 1-2 The Instruments toolbar
Table 1-3 Trace document toolbar controls
Control
Description
Pauses the gathering of data during a recording. This button does not actually stop recording, it simply stops Instruments from gathering data while a recording is under way.
Pause/Resume
button
In the track pane, pauses show up as a gap in the trace data.
Record/Stop
button
Starts and stops the recording process. You use this button to begin gathering trace data.
For more information, see “Collecting Data.”
Loop button
Sets whether the user interface recorder should loop during play back to repeat the recorded steps continuously. Use this to gather multiple runs of a given set of steps. For
information about playing tracks, see “Replaying a User Interface Track.”
Target menu
Selects the trace target for the document. The trace target is the process (or processes) for which data is gathered. For more information on choosing a trace target,
see “Choosing Which Process to Trace.”
Selects a time range in the track pane. When set, Instruments displays only data collected within the specified time period. Use the buttons of this control to set the start and end points of the inspection range and to clear the inspection range. For more
Inspection Range
control
information, see “Viewing Data for a Range of Time.”
Shows the elapsed time of the current trace. If your trace document has multiple data runs associated with it, you can use the arrow controls to choose the run whose data you want to display in the track pane. For information about trace runs, see “Viewing Trace
Time/Run control
Runs.”
Hides or shows the Instruments pane, Detail pane, and Extended Detail pane. This
View control
control makes it easier to focus on the area of interest.
Hides or shows the instrument library. For information on using the Library window,
Library button
see “Using the Instrument Library.”
Search field
Filters information in the Detail pane based on a search term that you provide. Use the search field’s menu to select search options. For more information, see“Searching in the
Detail Pane.”
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [9]
Instruments User Guide
1.4 示例:快速使用一个跟踪
为了记录跟踪的数据,你须要指定须要收集数据的目标,而后点击 Record 按钮。 大部分 instruments 工具容许你指定一个系统进程做为目标,而另一些 instruments 工具容许你收集多个进程的信息。
如下步骤描述了如何新建一个跟踪文档,配置它,并记录一些数据。Instruments 应用不能在运行以前执行这些步骤。
启动Instruments。应用会自动新建一个跟踪文档,并提示你选择一个模板。
选择 Activity Monitor 模板,而后单击选择按钮。Instruments 会把 Activity
Monitor instruments 工具添加到跟踪文档里面。
在跟踪文档的默认目标菜单里面,选择 All Process。
点击Record按钮。
等待几秒以便Instruments来收集一些数据。
点击Stop按钮。
恭喜你,你已经使用 Instruments 来收集了一些跟踪数据。Instruments 在跟踪
面板(track pane)里面显示了几个和系统加载、虚拟内存大小相关的图形。在详细 面板(detail pane)显示了在数据收集期间运行的进程列表。你能够在详细面板里 面选择不一样的视图模型来查看数据以不一样方式组织的形式。
1.5 下一步是什么?
如今已经介绍了和 Instruments 相关的基本概念,你能够开始更详细的探索 Instruments 应用了。剩下的章节提供了一个 Instruments 特性的深刻覆盖,包括如 何添加和配置 instruments 工具,如何记录用户界面轨迹,如何分析你收集的数据, 和如何把你收集的数据保存为之后使用。
记住程序分析是一门艺术也是门科学。在科学方面,也有一些能够遵循的指南来 发现问题。好比,若是你的应用程序占用内存过大,那么有多是应用程序在某些地 方分页,致使性能表现不佳。艺术方面,由于每一个应用程序如何减小内存占用的方案 四不一样的。是否应用程序收集的数据过多?是否它加载太多而又没有使用的的库?是 否内存泄露?这些都是你须要问你本身的问题,而 Instruments 只是一个你能够用来 早点答案的工具。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [10]
Instruments User Guide
第二章 添加和配置Instruments工具
Instruments 应用使用 instruments 工具来收集数据,并显示数据给用户。尽管 目前理论上没有限制你在一个文档里面包含的 instruments 工具的个数,可是大部分 文档出于性能缘由通常包含少于 10 个工具。你甚至能够屡次包含同一个 instument 工具,配置每一个 instrument 工具来收集来自不一样系统进程的数据。
Instruments 应用内置了普遍的 instruments 工具,能够使用它们来收集一个或 多个进程的特定数据。大部分这些 instruments 工具都须要少许甚至不须要任何的配 置就能够使用。你只要简单的把它们添加到你的跟踪文档,便可开始收集跟踪数据。 然而你也能够建立自定义的 instruments 工具,它们给你提供了普遍选择来收集数 据。
本章重点是介绍如何添加已有的 instruments 工具到你的跟踪文档里面,并配置 使用它们。关于如何建立自定义 instruments 工具的更多信息,参阅“使用 DTrace 建立自定义的 Instruments 工具”部分。
2.1 使用Instrument库
Instrument 库(如图 2-1 显示)显示了全部 instruments 工具,你能够把它们添加 到你的跟踪文档里面。该库包含了全部内置的 instruments 工具和你已经定义好的自 定义 instruments 工具。为了打开库的窗口,点击你的跟踪文档下面的 Library 按钮, 或者选择 Window > Library。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [11]
Instruments User Guide
Figure 2-1 The instrument library
由于库窗口里面的 instruments 工具太多,尤为是在你加入了你的自定义 instruments 工具以后,因此 Instruments 库窗口提供了几个组织和查找 instruments 工具的办法。如下部分就是讨论这些方法,并显示如何使用它们来组织可用的 instruments 工具。
2.1.1 修改库试图模式
库提供了不一样的视图模式来帮你组织可用的 instruments 工具。视图模式容许你 选择你要在每一个 instrument 工具显示的信息数量,和你想要 instrument 工具占据的 空间。Instruments 应用支持如下视图模式:
View Icons(查看图标).只显示每一个 Instrument 工具表明的图标。
View Icons 和 Labels(查看图标和标签).显示每一个 instrument 工具的图标和 名称。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [12]
Instruments User Guide
View Icons 和 Descriptions(查看图标和描述).显示每一个 instrument 工具的 图标、名称和详细描述。
View Small Icons 和 Labels(查看小图标和标签).显示每一个 instrument 工具 的名称和它小版本的图标。 注意:无论你选择了那种视图模式,库窗口老是在详细面板部分显示选择了的 instrument 工具的详细信息。
为了切换库的视图模式,你须要选择库窗口底部的 Action Menu 的所需模式。
除了切换库的视图模式,你也能够经过选择 Action Menu 里面的 Show Group Banners 来显示一组 instruments 工具的父组。库窗口为了方便以分组的方式组织 instruments 工具,帮助你缩小查找想要 instrument 工具的范围。默认状况下,组 信息没有显示在库窗口的主页上面。要以分组显示则须要添加 Show Group Banners 的选项,让它更容易识别 instruments 工具在某些视图里面的通常行为。
2.1.2 查找库里面的某个instrument工具
默认状况下,库窗口显示所有可用的 instruments 工具。然而每一个 instrument 工具属于一个大的分组,它标示了一个 Instrument 工具的目的和它收集数据的类型。 在库窗口的顶部,你能够使用组选项控制器来选择一个或多个分组来限制库窗口显示 instruments 工具的数量。当库里面包含不少 instruments 工具时,该方法可让你 更好的找到你想要的 instrument 工具。
组选项控制器包含两个不一样的配置。其中一个配置是库窗口显示一个弹出菜单, 你能够从中选择单一分组。然而若是你拖动一个分割栏位于弹出菜单和 instrument 面板下面,那么弹出菜单会变为一个大纲视图。在此配置下,你能够经过按下 Command 键和 Shift 键来选择多个你想要的分组。
图 2-2 显示了库窗口的标准模式和大纲模式。左边的是标准模式,你能够经过使 用弹出菜单来选择一个分组。窗口右边显示的是大纲视图,你能够选择多个分组和管 理你自定义分组。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [13]
Instruments User Guide
Figure 2-2 Viewing an instrument group
另一个在库窗口过滤内容的办法是使用窗口底部的搜索区域。使用搜索,你可 以快速的缩小须要查找的 instrument 工具的范围,你能够搜索它的名称、描述、分 类,结果是一列匹配关键字的工具。好比图 2-3 显示了匹配 file 关键字的 instruments 工具。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [14]
Instruments User Guide
Figure 2-3 Searching for an instrument
当库窗口是弹出框显示的时候,搜索过滤器的内容基于当前所选择的 instrument 组。若是是大纲视图显示时,不论那个分组被选中,搜索过滤器的内容是基于整个库 的 instruments。
2.1.3 新建一个自定义的instrument分组
除了能够使用内置的 instrument 分组,你还能够建立自定义分组来按照本身的 方式组织 instruments 工具。Instruments 支持两种自定义分组:静态分组(static groups)和智能分组(smart groups)。静态分组就是简单的静态。Instruments 不会 改变它们的内容,让你自由的配置你想要的分组。另外一方面,智能分组会根据指定的 条件动态的改变分组内容。你能够使用智能分组来显示一个最近使用的列表,或者 instruments 名称、描述包含特定关键字的分组。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [15]
Instruments User Guide
建立静态分组
为了建立一个静态分组,选择库窗口的 action menu 的 New Group,如图 2-4 所
示。
Figure 2-4 Creating a group
Instruments 建立了一个新的分组并把它添加到库窗口。为了查看新的分组和编 辑它的名称和内容,拖动分割栏到弹出菜单的下面来打开一个顶部面板显示分组的结 构,如图 2-5 所示。点击分组并填写一个新的名称。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [16]
Instruments User Guide
Figure 2-5 Editing the name of a group
为了添加一个 instrument 工具到静态分组,点击 Library 来显示 instruments 工具列表,选择 instrument 并拖动它到上面的分组面板,如图 2-6 所示。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [17]
Instruments User Guide
Figure 2-6 Adding an instrument to a custom group
你能够使用静态分组来建立层级的 instruments 组织。静态分组能够包含其余静 态分组,并且它还能够包含智能分组。然而智能分组不能包含其余分组。为了建立分 组的层级结构,你能够经过如下其中任何一种方式达到:
拖动一个分组到父静态分组
选择一个静态分组,而后选择 New Group 或 New Smart Group 来建立一个新的项 目做为所选择的静态分组的子分组。
一个包含有其余分组的分组显示它本身的 instruments 工具和它全部子分组的
instruments 工具。若是同一个 instrument 出如今多个分组,而且 Show Group Banners 选择勾选了,那么同一个 instrument 工具会在每一个包含它的分组下面列出。若是 Show Group Banners 选择没被勾选,那么库窗口合并相同的 instrument 副本到同一个主 体里面。
为了把一个 instrument 从静态分组删除,你须要完成如下的事情:
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [18]
Instruments User Guide
选择一个分组。
在分组里面选择一个你想要删除的instrument。
选择 action menu 的 Remove From Group,或简单的点击删除键。
为了从库里面删除一个静态分组,选择分组,而后选择 action menu 里面的 Remove
Group。若是你当前正在使用大纲视图查看分组,你也能够选择对应的分组,而后按 删除键。删除一个静态分组会删除该分组和它所包含的全部嵌套分组。然而该操做并 没有从库里面删除它包含的 instruments 工具。你能够在库分组里面看到这些 instruments 工具。
建立一个智能分组
为了建立一个智能分组,选择在库窗口的 action menu 里面的 New Smart Group。
图 2-7 显示了编辑规则。标签域标示了分组在库窗口里面出现的名称。其他的部分是 专门的配置规则,肯定那些 instruments 留在分组里面。
Figure 2-7 The smart group rule editor
每一个智能分组都必须包含至少一个规则。你能够跟踪须要添加额外的规则,使用 规则编辑的控制器和配置分组来应用全部或者部分规则。表 2-1 列举了你能够用来匹 配 instuments 的标准。
Table 2-1 Smart group criteria
Criteria
Description
Label
Matches instruments based on their title. This criterion supports the Starts With, Ends
With, and Contains comparison operators.
Matches instruments based on when they were used. You can use this criterion to match
Used Within
only instruments that were used within the last few minutes, hours, days, or weeks.
Search Criteria
Matches instruments whose title, description, category, or keywords include the specified
Matches
string.
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [19]
Instruments User Guide
Category |
![]() ![]() ![]() Matches instruments whose library group name matches the specified string. This criterion ![]() does not match against custom groups. |
为了编辑一个已有的智能分组,选择库窗口的分组,而后选择编辑 action menu 的<Group Name>,其中<Group Name>是你对应智能分组的名称。Instruments 应用会 再次显示规则编辑器,以便你能够修改已有的规则。
为了从库窗口里面删除一个智能分组,选择分组,而后选择 action menu 的 Remove Group 选项。若是你当前正使用大纲视图来查看分组,你也能够选择分组而后按删除 键。
2.2 添加和删除Instruments工具
为了添加一个 instrument 到跟踪文档,从库窗口里面拖动到你跟踪文档的
Instruments 面板或者跟踪面板,如图 2-8 所示。
Figure 2-8 Adding an instrument
你能够添加任意多的 instruments 工具到你的跟踪文档里面。尽管大部分 instruments 能够跟踪系统进程,可是许多只能跟踪一个进程。对于这些 instruments 工具,你能够使用多个 instrument 的实例并把它们赋值给你想要的不一样进程。经过 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [20]
Instruments User Guide
这样的方法,你能够同时收集多个程序的相同信息。好比,你可能须要在系统进程的 样本和它相应的客户端进程上面这么作,分析总体的交互模式。
为了从一个跟踪文档删除一个 instrument 工具,选择 Instruments 面板中对应 的 instrument 工具而后按删除键。
2.3 配置一个instrument工具
一旦你把 instrument 工具添加到 Instruments 面板,那么大部分 instruments 工具便可运行。部分 instruments 工具也能够使用 instrument 检查器来配置。检查 器的内容因 instrument 工具不一样而不一样。大部分 instruments 工具包含了配置的可 选项来配置跟踪面板的内容,而少部分包含了额外的控制器来决定 instument 工具自 己收集什么类型的信息。
为了打开一个给定的 instrument 工具的检查器,选择 instrument 工具,而后作 如下任何一种操做:
点击instrument工具名称右边的检查器图标
选项File > Get Info
单击Command-I
检查器会出如今 instrument 工具名称的旁边,如图 2-9 所示。为了隐藏检查器, 你能够单击关闭按钮。(你用来打开检查器的命令一样能够用来关闭检查器)
Figure 2-9 Inspector for the File Activity instrument
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [21]
Instruments User Guide
在跟踪面板上面和显示信息相关的控制器能够在你给跟踪记录数据以前、期间、 以后配置。Instruments 工具自动为显示选项收集它须要的数据,不管显示选项当前 是否显示在跟踪面板上面。
在跟踪面板中的检查控制器里面的缩放控制器能够用来校验跟踪数据的放大率。 改变缩放值会改变 instrument 工具在跟踪面板里面的高度。View > Decrease Deck Size 和 View > Increase Deck Size 命令作相似的工做来递减和递增跟踪面板里面 的所选 instrument 工具的放大倍率。
关于 instruments 工具的列表,包含配置选项,参阅“内置 instruments 工具” 部分。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [22]
Instruments User Guide
第三章 记录跟踪数据
在决定使用什么 instruments 工具来收集数据以后,下一步就是选择须要跟踪的 进程,并开始记录数据。如何选择进程依赖于你跟踪文档里面的 instruments 工具。 部分 instruments 工具容许跟踪全部系统进程,其余要求你只能为一个进程记录数 据。部分 instruments 工具甚至但愿你从 Instruments 应用里面启动进程以便它们可 以在进程执行以前收集数据。
Instruments 应用提供了几个初始化跟踪的可选项,它们可让你更容易的整合 instruments 工具到你的开发周期里面。在本章里面,你将会学到如何为一个跟踪文 档选择一个进程,并开始使用 Instruments 应用里面可选的选项来记录数据。
3.1 选择须要跟踪的进程
在你开始收集数据以前,你必须告知 Instruments 应用,它处理你想要的跟踪。 你能够经过使用 Instruments 工具栏上面的 Target menu 来指定一个目标进程(或多 个进程)来完成。该菜单提供了如下的选项:
All Processes(全部进程).配置你的文档来跟踪全部系统进程。
Attach to Process(附加到进程).配置你的文档来跟踪一个已经运行的进程。
Choose Target(选择目标).配置你的文档来启动并跟踪一个进程。(若是进程已
经运行,Instruments 应用会启动一个新的副本并跟踪它)
Instrument Specific(Instrument 指定).选择该项目来给独立的 instruments
工具指定不一样的跟踪目标。 如下各部分描述了每一个选项更详细的信息。
3.1.1 跟踪全部进程
部分 instruments 工具能够给当前计算机全部运行进程收集数据。你能够使用这 些功能来配置文档到整个系统中的事件或活动类型。好比,你能够使用 Disk Activity 的 instrument 工具来跟踪全部在特定周期内发生在你计算机上面的可读和可写的操 做。为了跟踪全部运行的进程,选择 Target menu 里面的 All Process 选项。
注意:All Processes 项目只有当你 Instruments 面板上面的全部 instruments 工具都支持
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [23]
Instruments User Guide
的时候才可用。
3.1.2 跟踪一个已有的进程
若是你想要跟踪的进程已经在计算机上面运行了,那么大部分 instruments 工具
能够附加到该进程中并开始收集数据。为了跟踪一个已有的进程,选择 Target menu
里面的 Attach to Process 选项并须要跟踪的进程,如图 3-1 所示。
Figure 3-1 Tracing an existing process
3.1.3 跟踪一个新的进程
若是你想要跟踪的进程还没在计算机上面运行,或者你想要控制已经启动的进程 的条件,选择 Target menu 上面的 Choose Target 选项。Instruments 应用会记录最 近启动过的进程并把它们添加到 Choose Target 的子菜单下面提供快速访问。若是你 想要启动的进程没有在菜单里面,选择 Choose Target 来显示对话框,如图 3-2 所示:
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [24]
Instruments User Guide
Figure 3-2 Choosing a target to launch
Choose Target 对话框让你选择要启动的程序,同时让你指定如何启动所选的程 序。表 3-1 列出了对话框中额外的控制并解析如何使用它们。
Table 3-1 Options for launching an executable
Control
Description
Identifies environment variables you want to set before running the process. You might use this option if your program has debugging options that are enabled using an environment
Environment
Variable
variable. Use the plus (+) and minus (-) buttons to add or remove environment variables.
Arguments
Use this field to specify any launch arguments for the application. The arguments you specify are the same ones you would use from the command line when launching the
application there.
Use this menu to specify other runtime options. For example, you can direct the application’s output to the Instruments console or the system console, or discard the output. You can also
Options
specify whether the application is launched in 32-bit or 64-bit mode.
Sets the specified application as the target for all instruments in the trace document. This option is enabled by default. Disabling it lets you assign different targets to different instruments in your trace document. You might use this feature when you have two copies of the same instrument or when you want to trace the behavior of two processes running side
View All
by side.
Traverse |
Packages |
Displays bundles (such as applications and plug-ins) as a navigable directory structure. Use
this feature if the executable you want to run is inside a bundle.
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [25]
Instruments User Guide
3.1.4 给每一个Instrument工具指定不一样的目标
当你在 Target menu 里面选择了 All Processes、Attach to Process 或 Choose Target 选项,Instruments 应用给你选择的程序的全部 instruments 工具设置默认的 目标。然而不管什么时候你均可以给每一个 instrument 工具设置不一样的目标。你可能想要 在同一个时间采样两个不一样的程序,好比使用 instrument 示例。若是你已经有一些 instruments 工具能够跟踪全部进程,你可能想让它们在单进程 instruments 样本的 时候仅是一个进程。
为了给每一个 instrument 工具设置基础的跟踪目标,你能够作如下这些:
在 Target menu 里面,选择 Instrument Specific 的选项。
选择你的instruments工具里面的其中一个。
单击i图标来打开instrument工具的检查器。
在检查器的窗口,使用目标区域的弹出菜单来给 instrument 工具设置目标,如
图 3-3 所示。
Figure 3-3 Choosing per-instrument trace targets
重复第2步到第4步来给每一个instrument工具设置目标。
3.2 收集数据
在你已经选择了一个要跟踪的进程以后,你就能够开始收集数据了。你能够使用 两个不一样的记录模式之一来收集数据:
Immediatedisplay(当即显示)。在测量的期间,Instruments应用在跟踪面板和
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [26]
Instruments User Guide
详细面板当即显示收集的数据。Instruments 工具栏上面的时间控制器一样显示 了你开始记录数据多长时间了。在这个模式下,Instruments 影响系统性能,因 为 UI 要持续的更新。这个模式是 Instruments 应用的默认模式。为了选择当即 显示,选择 File > Record Options > Immediate Display。
Deferred display(延迟显示)。Instruments 应用延迟显示收集的数据直到记录 中止。在测量期间,Instruments 对系统的影响很是小。当你中止记录的时候, Instruments 应用开始处理并显示收集的数据。延迟显示是一个很重要的特性, 当应用程序对性能很敏感的时候。为了选择延迟显示,选择 File > Record Options > Deferred Display。
记录模式随文档持久性的。
点击 Record 按钮(或选择 File > Record Trace)来开始收集跟踪的数据。当你 单击 Record 时,Instruments 启动指定的可执行文件或附加到指定进程,并开始收 集数据。为了中止收集数据,单击 Stop 按钮或者选择 File > Stop Trace。
注意:当你单击 Record 按钮时,Instruments 应用有可能显示一个或多个认证对话框。一些 instruments 工具在开始记录任何数据以前须要验证你是不是管理员。Instruments 应用是一个 很强大的工具,可让你查看正在运行的应用,所以它应该只能被受权的用户使用。
在记录期间,若是你想要你的程序继续运行,可是又不想让 Instruments 应用收 集数据,单击你的跟踪文档里面的 Pause 按钮。Instruments 应用暂时中止收集数据, 可是并无中止当前正在执行的记录。单击 Resume 按钮会让 Instruments 应用继续 在当前记录时间里面收集数据。因此暂停和继续会在你的跟踪面板上面产生一个数据 空白区域。
3.3 使用快速启动键启动Instruments
快速启动键是全局组合键,它可让你启动 Instruments 应用程序并使用指定的 文档模板当即开始收集跟踪数据。你能够使用这一特性,若是你当前正在运行一个应 用程序或者查看一些你须要当即捕获的事情(好比调试或反应迟钝的行为)。你能够 关联不一样的组合键到不一样的 instruments 模式上来捕获不一样的行为。
为了赋值一个快速启动键,打开 Instruments 应用的偏好设置,并导航到快速启 动面板。该面板显示了你能够赋值组合键的 instruments 模板的列表。全部的模板
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [27]
Instruments User Guide
没有快捷键启动。要赋值一个的话,找到包含设计模板的行,双击它的 Key 列来建立 一个可编辑的单元。当该单元处于编辑模式时,选择你想要的组合键并单击它们。比 如,为了赋值一个组合键 Command-Option-1,同时按下 Command、Option 和数字 1 的 键。
为了从模板中删除一个组合键,选择一行并按删除键。
注意:快速启动组合键起码要使用至少两个不一样的按键(Command、Option、Control、Shift)。 你应该避免使用已经被其余应用程序使用的组合键。
为了使用快速启动键来给应用程序收集数据,你要作如下步骤:
把光标放在属于你要跟踪的应用程序的窗口上面。
按下合适的组合键来开始跟踪。
运行应用程序。
当你想中止跟踪的时候,你有两种选择:
把光标放在其中之一的应用程序窗口上面,再次按下组合键。
找到已经打开的跟踪文档并按下Stop按钮。 由于快速启动键要求你把光标移动到其中一个应用程序窗口之上,你能够使用同
一个快速启动键来给不一样的应用程序初始化多个跟踪对话而无需中止任何以前的跟 踪。你也能够使用不一样的组合键来给同一个应用程序开始不一样类型的跟踪,并让它们 在同一个时间收集全部的数据。
3.4 以最小模式运行
最小模式(Mini mode)为你提供了一种在收集数据的时候尽可能减小 Instruments 应用程序可视化尺寸的方法。当你从特定类型的应用程序收集数据的时候,尤为是面 向图形的应用程序,在你集中于你应用程序的时候,不少时候你须要收集你的数据。 最小模式隐藏不少打开的跟踪文档,在它们的地方显示不少浮动的窗口,你能够使用 它们来开始和中止跟踪。最小模式的一个优势是 Instruments 应用程序自己须要不多 的绘画,因此对系统性能影响不多。
图 3-4 显示了打开几个跟踪文档的最小化 Instruments 应用窗口。Instruments 应用在最小模式的时候同一时间只显示三个跟踪文档,可是你能够使用向上和向下箭 头来找你想要的跟踪文档。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [28]
Instruments User Guide
Figure 3-4 The Mini Instruments window
单击跟踪文档附近的 Record 按钮开始为文档记录数据。文档在跟踪以前必须配 置好它的 instrument 工具和目标进程。在跟踪期间,Instruments 应用显示跟踪开 始后所用的时间,可是不显示其余 instruments 工具、控制器或数据。
为了启用最小模式,选择 View > Mini Instruments。为了禁用最小模式,单击 最小模式的 Instruments 窗口的关闭框。你也能够在标准和最小模式之间切换,经过 选择 View > Mini Instruments。
3.5 从Xcode运行Instruments应用
在开发期间,你能够从 Xcode 3 的用户界面直接加载你的应用程序到 Instruments 应用里面。这个整合功能可让你同时快速的加载 Instruments 应用和收集跟踪数 据,那会启动你的程序并使用 GDB 调试它。
Xcode 3 里面的 Run > Run with Performance Tool 子菜单提供了几种使用可用 性能工具来加载你程序的方法,包括 Instruments。当加载你的应用程序到 Instruments 应用的时候,你能够经过选择合适的菜单项目告诉 Xcode 你想要使用的 Instruments 模板。Xcode 加载 Instruments,使用特定的模板新建跟踪文档,为你的 程序设置目标,并告诉 Instruments 来加载你的程序和开始记录数据。
除了在 Run with Performance Tool 子菜单已有的模板,Xcode 一样容许你添加 自定义的跟踪模板到菜单栏。关于更多如何保存一个跟踪模板并把它添加到菜单的信 息,参阅“保存 Instruments 跟踪模板”部分。
3.6 无线链接iOS设备
为了使用扩展访问给 iOS 应用程序收集数据,你能够在 Instruments 应用和你的
设备之间创建一个无线链接。当一个无线设备不切实际或不方便的时候你也能够使无
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [29]
Instruments User Guide
线链接。
软件要求:该特性在 iOS SDK 3.1 及其以后可用。
一般来讲,若是你不须要附加一个扩展访问到你的设备,你须要使用一个有线连 接。无线链接比有线链接慢,而且要耗更多设备的电来适应来自 Instruments 的繁忙 信息流。结果,使用无线链接比有线链接耗费更多的电池。
重要:为了让 Instruments 应用能够无线链接你的设备,你的 Mac 设备和 iOS 设备都必须拥有开 启的无线网络,而且必须链接到同一个无线接入点。该接入点必须被配置提供 Bonjour 服务。
为了创建一个 Instruments 应用和你设备本身的无线链接:
把你的设备经过USB线链接到你的电脑。
在Xcode里面,把你的应用程序载入你的设备。
在Instruments里面,打开或新建一个跟踪文档。
按下 Option 键,并选择 Target menu 里面的“Enable <device_name> -
Wireless”选项,如图 3-5 所示。
Figure 3-5 Creating a wireless connection between Instruments and an iOS device
一会以后,一个无线的目标出如今 Target menu 上面,名为“<device_name> Wireless”。若是该无线目标不出现,你的 Wi-Fi 接入点可能没有被配置来提供 Bonjour 服务。
这个时候你有两个 Instruments 服务器运行在你的设备上面:一个使用有线链接, 另外一个使用无线链接。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [30]
Instruments User Guide
5. 从你的设备上面断开USB线,而后链接扩展访问。
如今你能够使用 Instruments 应用来收集关于你应用程序性能的数据,就如“选 择要跟踪的进程”部分介绍的同样。
无线链接即便在 Instruments 退出或锁定你的设备以后,它依然起做用。在网络
链接条件如以前提到的同样,你能够继续使用无线链接。 为了中断无线链接:
在Instruments应用里面,打开一个跟踪文档。
按下 Option 键,而后选择 Target menu 下面的“Disable <device_name> -
Wireless”。过了一会以后,该“<device_name> Wireless”的目标变暗,意味 无线链接和 Instruments 服务器已经中断。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [31]
Instruments User Guide
第四章 记录用户界面轨迹
用户界面轨迹记录运行程序的一系列事件和操做。在事件被记录以后,你能够多 次回放跟踪来反复生成相同的一系列事件。每次你回放用户界面轨迹时,你能够在你 的跟踪文档里面使用其余 instruments 工具来收集数据。这样作的好处是每次成功运 行后你均可以比较你收集的数据,而且使用它来改变你程序的性能或行为。
4.1 记录用户界面轨迹
你能够使用 User Interface 的 instrument 工具来记录用户界面轨迹。你把该 instrument 工具添加到跟踪文档,就像添加其余 instrument 工具那样。当你单击你 文档里面的 Record 按钮时,User Interface instrument 工具开始收集和用户输入 相关的事件,例如鼠标和键盘事件等。它收集这些事件并在跟踪面板上面显示它们给 你查看和检查。
注意:若是你使用 UI Recorder 模板来新建一个新的跟踪文档,Instruments 应用会自动为你添 加 User Interface 的 instrument 工具到文档里面。
在你为用户界面轨迹收集了一系列事件后,Record 按钮的标题会改成 Drive&Record。再次点击这个按钮会让 Instruments 应用来驱动用户界面,重放你之 前记录的一系列有序的事件。当作这些的时候,在你跟踪文档里面的其余 instruments 工具一般会收集数据。在事件流完成后,你应该检查运行数据。图 4-1 显示了一个使用用户界面轨迹和其余 instruments 工具的跟踪文档。这里用户界面轨 迹已经包含了一系列待重放的有序的事件。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [32]
Instruments User Guide
Figure 4-1 Recording a user interface track
重要:录制用户界面一般使用屏幕阅读器和其余为残疾人使用的辅助设备的访问特性。为了保证 你的计算机支持该特性,打开系统偏好设置的全局访问(Universal Access)面板,确保“容许 访问辅助设备(Enable access for assistive devices)”的设置被启用。
User Interface instruments 工具的详细面板列出了被记录的事件,事件的定位, 和被任何按下的键。该 instrument 工具一样能够捕获屏幕被用户操做的部分区域。 缩略图版本的屏幕截屏被同时显示在跟踪面板和详细面板上面。每一个事件都根据它的 不一样类型进行着色:
鼠标事件为蓝色 键盘事件为绿色 系统事件为黄色
4.2 重复记录用户界面轨迹
如何在捕获一系列事件后,你决定没有得到正确的事件序列,你能够回头并从新 捕获须要的事件直到得到正确的。在你从新捕获事件以前,你必须告知 Instruments 应用不要使用老的事件序列来驱动用户界面。User Interface 检查器的 Action 区域 包含了一个弹出菜单,它可让你指定让 instrument 工具如何运行。一般在你捕获
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [33]
Instruments User Guide
事件序列后,Action 设置会被找到设置为 Drive。为了从新捕获,你必须修改设置为 Capture。完成这些以后,你能够开始记录新的事件序列了。由于每次捕获完成后 Action 设置会切换回 Drive,因此屡次从新捕获一个事件序列的时候要求你每次记录 以前把 Action 设置修改成 Capture。
4.3 回放用户界面轨迹
在你记录了用户界面轨迹以后,你能够回放这些轨迹来从新生成一系列你记录的 用户事件。在记录了一系列事件以后,Instruments 应用会自动把它的 Record 按钮 的标题改成 Drive&Record。单击该按钮来启动选择的应用程序,并执行在用户界面 轨迹里面每一个记录的动做。与此同时,Instruments 应用开始在 Instruments 面板上 面其余活动的 instruments 工具收集相关的数据。
每次成功运行用户界面轨迹后,Instruments 应用都会在跟踪面板显示运行的结 果。为了修改跟踪面板中活动的结果,你能够使用事件控制器的箭头。单击这些箭头 切换于改可用的数据集,会没每一个能够的 instruments 工具更新显示结果。
你也能够同时查看同一个 instrument 工具全部运行的结果。每一个 instrument 工
具在它的左侧都会有一个下拉的三角形。点击该控件能够扩展 instrument 工具并对
齐的显示以前运行的全部结果数据,如图 4-2 所示。
Figure 4-2 Viewing multiple runs
当收集跟踪数据时,你能够点击文档工具栏的 Loop 按钮来让 Instruments 应用 屡次重复用户界面轨迹的事件。该按钮是黏性的,因此单击它启动循环而再次单击则 禁用循环。当循环启用是,Instruments 应用在连续循环里面运行一系列有序的事件,
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [34]
Instruments User Guide
在循环过程当中每次收集新的跟踪数据。你能够使用该特性来重复一系列事件,这些事 件是屡次尝试后展现的不良行为。你也能够使用循环来让你的应用程序持续工做来对 它进行压力测试。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [35]
Instruments User Guide
第五章 查看和分析跟踪数据
由于 Instruments 应用可让你同时收集多个 instruments 工具的数据,所以你 可能得到的数据量在短期是大量并且压倒性的。幸运的是,Instruments 提供了很 好的接口来帮助你组织和显示你收集的数据以便你分析和导航这些数据。弄懂你跟踪 文档窗口里面不一样区表明的信息对于你查看趋势和查找潜在问题很是重要。
每一个跟踪文档都包含了如下接口元素: 跟踪面板(Track pane)
详细面板(Detail pane)
展详细面板(Extended Detail pane) 运行浏览器(Run Browser)
这里的每一个控件显示的都是你跟踪文档里面相同的数据。它们只是以不一样的方式 显示而已,关于每一个数据点从高级的预览到详细的信息等。这样可让你以不一样的方 式来查看你的数据。你能够经过查看高级的数据来分析变化趋势,而后查看详细的数 据来肯定在你的代码中将要发生的事情和制定关于如何解决潜在问题的思路。
除了用户界面的可选项,许多 instruments 工具能够经过配置来以不一样的方式呈 现数据。你能够使用这些配置选项在分析过程当中获取对收集的数据新的透视。
本章中你能够学习如何使用这些 Instruments 应用给你提供的数据,和如何按照 你的工做流需求修改这些信息数据的呈现方式。
5.1 查看数据的工具
如下部分描述了 Instruments 用户界面里面关键的元素和如何使用这些元素来查
看跟踪数据。
5.1.1 跟踪面板
跟踪面板是跟踪文档窗口里面最突出的部分。跟踪面板紧接于 instruments 面板 的右边。该面板为每一个 instrument 工具提供了收集数据的一个高级图形视图。你可 以使用该面板来核查你从每一个 instrument 工具收集到的数据,并能够选择你想进一 步研究的区域。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [36]
Instruments User Guide
跟踪面板中的天然图形可让你更容易的发现你程序的趋势和潜在的问题。比 如,图形中一个内存使用的尖峰信息意味着在该地方你的程序分配的内存比平时更 多。该尖峰信息多是正常的,也多是意味你的代码比你预计在此地方建立了更多 的对象或内存缓冲区。一个 instrument 工具(例如 Spin Monitor instrument)也 一样能够指出你程序反应迟钝的地方。若是 Spin Monitor 的图形相对是空白的,你 就知道你的程序是正常响应,但若是该图形不空白,那么你可能须要核查为何会出 现这样的状况。
图 5-1 显示了一个跟踪文档的示例,该示例显示了全部跟踪面板的基本特性。你 能够使用该面板顶部的时间线来选择核查的地方。点击时间线并移动播放头来定位和 显示检查器的旗帜(inspection flags),该旗帜总结了 Instrument 中该定位地方的 信息。你也能够点击时间线来汇集数据点在详细面板上面的信息;参阅“详细面板” 部分。
Figure 5-1 The track pane
虽然每一个 instrument 工具都不一样,可是它们绝大部分都会提供修改跟踪面板数 据显示的选项。除此以外,部分 instruments 工具还能够经过配置在它们跟踪面板里 面显示多个数据集。这两个特性可让你选择按照你程序最方便的形式来显示数据。
如下部分提供了关于跟踪面板更多的信息,以及如何配置它们。
查看跟踪运行
每次你点击跟踪文档里面的 Record 按钮,Instruments 应用就会开始收集目标进
程的数据。Instruments 应用建立新的跟踪运行来保存数据,而不是经过把新的数据 拼接到现有数据的后面。一个跟踪运行(trace run)构成由你点击了 Record 按钮来开 始收集到点击 Stop 按钮来中止收集之间的数据。默认状况下,Instruments 应用只 在跟踪面板里面显示最近的跟踪运行,可是你也能够经过如下任何一种方法来查看之
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [37]
Instruments User Guide
前的跟踪运行的数据:
使用工具栏上面的Time/Run控件来选择你想要查看的跟踪运行。
点击instrument工具旁边的下拉三角形来显示该instrument工具下面的全部跟
踪运行的数据。
图 5-2 一个已经被扩展显示多个跟踪运行的 instrument 工具。在该例中,几个 跟踪运行都已经收集了数据,这些数据都是由轻微不一样的事件产生。当你正在尝试重 现一个并非每次运行均可以出现的问题时,你能够收集多个跟踪运行的数据,建立 新的跟踪运行直到问题出现。然而若是你想要使用相同的事件集来比较多个跟踪运 行,你须要建立新的用户界面轨迹和一个想要的进程,该进程在“使用用户界面轨 迹”部分介绍。
Figure 5-2 Viewing multiple runs of an instrument
当你保存一个跟踪文档,Instruments 应用一般会摒弃全部跟踪运行的数据,除 了你当前选择的那个。这样可让你的跟踪文档体积不至于太大。若是你想要保存你 跟踪文档里面全部跟踪运行的数据,进入 Instruments 应用的偏好设置的 General, 并取消勾选 Save Current Run Only 选项。
显示同一个 Instrument 工具的多个数据集
一些 instruments 工具是能够在相应的跟踪面板显示多个数据流。你能够使用
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [38]
Instruments User Guide
instrument 检查器来显示特定的数据流,如图 5-3 所示。Statistics to Graph 列 出了全部由 instrument 工具收集的整型的数据值。勾选相应的复选框来添加相应的 统计到跟踪面板里面。为了编辑 Statistics to Graph 里面统计的列表,选择 Configure 按钮。
Figure 5-3 Configuring the statistics to graph
关于每一个 instrument 工具收集的数据的信息,参阅“内置 instruments 工具”。
修改跟踪显示的样式
Instruments 应用提供了几种在跟踪面板显示收集的数据的样式。大部分
instruments 工具默认选择一个能够显示多个数据类型的样式。你能够使用 instrument 的检查器上面的样式弹出菜单来修改选择的样式。图 5-4 显示了几种样 式。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [39]
Instruments User Guide
Figure 5-4 Track styles
注意:你所选择的样式会影响全部 instrument 工具显示的数据流。
缩放跟踪面板
Instruments 应用提供了对跟踪面板数据在水平方向轴和垂直方向轴的缩小和放
大。
为了修改水平方向(时间相关)的放大倍数,使用instruments面板下面的滑块
控制器。
为了修改垂直方向(幅度和体积相关)的放大倍数,选择一个instrument工具,
并作下面任一事情:
打开instrument工具的检查器,使用缩放滑块。
选择 View > Increase Deck Size 的菜单选项来递增缩放因子。 选择 View > Decrease Deck Size 的菜单选择来递减缩放因子。
对于水平方向的缩放,Instruments 应用扩大和合并跟踪面板周围的播放头 (playhead)的位置。若是你在缩放以前把播放头设置在特定的位置点,你能够在该位 置点下缩小和放大数据。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [40]
Instruments User Guide
5.1.2 详细面板
当你在跟踪面板里面肯定潜在问题区域后,你能够使用详细面板来核查该区域的 数据。详细面板显示了和当前所选择的 instrument 工具的跟踪运行相关的数据。 Instruments 应用在详细面板只显示一个 instrument 工具相关信息,全部你必须通 过选择不一样的 instruments 工具来查看不一样的详细信息。
在详细面板里面不一样的 instruments 工具显示不一样类型的数据。如 5-5 显示了和 File Activity instrument 相关的详细面板,它记录了和指定文件系统例程相关的 信息。这里面的详细面板显示了文件系统例程调用的方法和函数,使用的文件的描述, 和访问的文件的路径。关于每一个 intrument 工具在详细面板显示的信息,参阅“内置 instruments 工具”。
Figure 5-5 The Detail pane
你能够作如下任一事情来打开和关闭详细面板: 选择 View > Detail
单击工具栏上面的 Detail View 按钮
修改详细面板的显示样式
对于部分 instruments 工具,你能够在详细面板里面使用多于一个格式显示数据。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [41]
Instruments User Guide
详细面板支持如下的格式模式:
列表模式(Table mode),显示一列扁平的汇总样本数据列表。
大纲模式(Outline mode),显示样本的层级结构,一般使用堆栈跟踪或进程
信息来组织。
图形模式(Diagram mode),显示一列独立的样本数据。
为了使用任意的格式来查看 instrument 工具的数据,选择导航栏最右边的合适 的模式。instrument 工具是否支持该模式取决于经过该 instrument 工具收集的数据 类型。好比,Sampler instrument 工具就不支持图形模式,可是 Activity Monitor instrument 工具就支持全部的模式。
可是使用大纲模式显示数据的时候,你能够使用相应行的左边的扩展三角形来向 下扩展相应的层级结构。单击一个扩展三角形会扩展阅读或者关闭给定的行。为了扩 展行和它全部的子行,按下 Option 键并同时单击扩展三角形。
在详细面板里面排序 你能够根据特定列的数据来给详细面板显示的信息进行排序。为了达到这个目
的,单击相应列的头。详细面板里面的列根据不一样的 instrument 工具而不一样。
在详细面板里面搜索 你能够在工具栏上面的搜索域里面输入要搜索的字符串来缩小在详细面板显示
的信息的范围。默认状况下,Instruments 应用在 instrument 工具记录的全部数据 里面搜索给定的字符串。然而使用部分 instrument 工具,你甚至能够提炼搜索的范 围。好比,使用 Allocations instrument 能够在 instrument 数据子集里面搜索给定 的字符串,好比建立内存块的库或例程。你甚至能够在特定的内存地址里面搜索对象。
范围过滤器根据不一样的 Instrument 工具而不一样。为了指定特定的目标区域,单 击搜索域的放大镜按钮,并从可选项中选择范围。图 5-6 显示了 Allocations instrument 的搜索可选项。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [42]
Instruments User Guide
Figure 5-6 Filtering the Detail pane
查看时间范围的数据 虽然在跟踪面板里面放大一个特定的事件可让你查看在具体时间里面发生了
上面事情,可是你也可能对在某个事件范围没收集的数据感兴趣。你能够使用 Inspection Range 控件(如图 5-7 所示)来聚焦在某个特定的时间范围收集的数据。
Figure 5-7 Inspection Range control
能够执行如下的操做来标示一个时间范围: 1. 设置范围的开始
A. 在跟踪面板里面拖动播放头到预约开始的时间点
B. 单击 Inspection Range 控件里面最左边的按钮 2. 设置范围的结束
C. 拖动跟踪面板里面的播放头到预约的结束时间点
D. 单击 Inspection Range 控件里面最右边的按钮
Instruments 应用会在跟踪面板里面突出你指定范围的内容。当你设置了一个开
始时间,Instruments 应用会自动的选择从开始的时间点到当前跟踪运行的点之间。 若是你开始就设置告终束时间点,Instruments 应用会选择从跟踪运行的开始点到你 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [43]
Instruments User Guide
指定点之间。
你也能够在跟踪面板里面预设的 insturment 工具上经过按住 Option 键并单击和
拖动核查范围来设置它的区域。单击并拖动鼠标活跃的 instrument 工具(若是它尚 未活跃),并根据 instrument 工具来使用鼠标按下和鼠标放开来设置范围。
当你设定了一个时间范围,Instruments 应用会过滤详细面板的内容,显示只有 符合指定范围的收集数据。你能够快速的缩小由 Instruments 应用收集信息的范围并 只查看这些在特定周期发生的事件。
为了清空核查范围,单击 Inspection Range 控件里面中间的按钮。
5.1.3 扩展详细面板
对于部分 instruments 工具,扩展详细面板显示了当前在详细面板里面所选择的 项目的额外信息。你能够执行如下任一操做来打开和关闭扩展详细面板:
选择 View > Extended Detail。
单击工具栏下面的 Extended Detail View 按钮。
扩展详细面板一般包括一个被记录的探头(probe)或者事件的描述,一个堆栈 跟踪,和信息被记录的时间。然而,并非全部的 instruments 工具都会显示这些信 息。部分 instruments 工具可能并未提供任何扩展详细信息,而其余可能在该面板上 面提供其余信息。关于具体 instrument 工具在该面面板显示什么信息,查看“内置 instruments 工具”里面的 instrument 工具描述。
图 5-8 显示了 Allocations instrument 的扩展详细面板。在该例中,Instrument 应用显示关于分配内存的类型的信息,包括它的类型,指针信息,和大小。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [44]
Instruments User Guide
Figure 5-8 Extended Detail pane
你能够使用该区域顶部的 Action menu 来配置在堆栈跟踪里面显示的信息。点击 并按住 Action menu 的图标将会显示一个菜单,在该菜单里面你能够启用和禁用相应 表 5-1 中选项。
Table 5-1 Action menu options
Action
Description
Invert Stack
Toggles the order in which calls are listed in the stack trace.
Source Location
Displays the source file that defines each symbol whose source you own.
Library Name
Displays the name of the library containing each symbol.
Frame #
Displays the number associated with each frame in the stack trace.
File Icon
Displays an icon representing the file in which each symbol is defined.
Trace Call Duration
Creates a new Instruments instrument that traces the selected symbol and places
that instrument in the Instruments pane.
Look up API
Opens the Xcode Documentation window and brings up documentation, if available,
Documentation
for the selected symbol.
Copy Selected Frames
Copies the stack trace information for the selected frames to the pasteboard so that
you can paste it into other applications.
如你有一个 Xcode 项目,它的源码字符被列举在堆栈跟踪上面,你能够单击一个 字符的名称来在扩展详细面板里面显示相关的源码。该源码被标注为和性能有关。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [45]
Instruments User Guide
堆栈跟踪能够经过使用扩展详细面板下面的滑块来折叠显示。这就是所谓的过滤 的回溯压缩。该特性的目的是减小堆栈跟踪的详细信息,并显示重要部分。
5.1.4 运行浏览器
运行浏览器是一个快速查看和管理以前运行的方法。若是你的跟踪文档包含数个 运行,你能够使用该模式在列表的顶部扫描你想要并促进它的运行。你也能够删除这 些运行,并给当前视图的运行添加注释。
选择 View > Run Browser 来打开运行浏览器。
运行浏览器显示了 Instruments 应用里面的 Run Browser 视图。单击所选视图的 任何一边会让新的视图滚动进入聚焦。为了给视图添加一个注释,双击文本框里面的 Comment 域来让他进入编辑状态。为了退出一个运行浏览器视图,点击窗口底部右边 的返回箭头按钮。
Figure 5-9 The Run Browser
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [46]
Instruments User Guide
5.2 分析技术
收集和查看跟踪数据很简单。可是分析数据并定位潜在的问题就比较困难。后者 的任务把性能调优和调试的艺术变为现实。意识到在性能工具收集大量数据多是艰 巨的,即便是经验丰富的开发人员。这有合适的工具(如何知道如何使用它们)让它 不同凡响。Instruments 应用的 instruments 工具提供了不少组织和过滤跟踪数据的 不一样选项。如下部分描述了其中特定的 instruments 工具部分的行为和选项,和如何 使用这些 instruments 工具来标示你代码中的问题。
5.2.1 使用Sampler Instrument分析数据
Sampler instrument 工具是一个在运行的程序上面执行统计分析的工具。执行样 本统计包括在按期中止应用程序并记录在那个一刻执行的信息。对于每一个线程, Sampler instrument 工具记录当前在堆栈上面执行的函数和方法,包括拥有函数或 方法的名称和拥有它的模块。收集数据以后,它从独立的样本里面合并堆栈调用信息 造成主应用程序的调用树。该树显示了全部采样期间执行路径和每一个被采样了多少 次。
样本统计的优势是它是一个轻量级的并很方便的方式来发现你应用程序在一个 周期里面所作的工做。该技术能够在任何没有安装特别的插件代码的应用程序里面使 用,并且它一般提供了一个合理准确了解你应用程序的运行行为的图片。
然而样本统计的缺点是它没办法给你的应用程序所作的事情提供一个 100%的图 片。由于它只是按期的对调用堆栈作一个快照而已,Sampler instument 工具并无 精确的记录函数和方法执行的历史。典型的采样间隔 1 到 10 毫秒,在这样本里面有 可能多个函数和方法已经被调用。尽管这些图片看似不许确,在采集的样本足够多的 时候它一样对大部分程序有效果。随着时间的推移,越多样本被采集,采样间隔越容 易形成的扭曲。所以,统计样本依然是一个很好的方式来快速收集你应用程序的信息 而无需太多的精力。
注意:Sampler instument 替代了 Sampler 程序,而样本程序在 Mac OS X v10.5 及其以后不可用。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [47]
Instruments User Guide
分析堆栈调用的数据
Sampler instrument 工具的主要目的是显示程序在该地方的地消耗的时间。它通
过给你显示什么函数被调用而且被调用的次数来达到该目的。
Sampler 工具开始的地方是跟踪面板。默认状况下,跟踪面板中的图形显示应用
程序全部线程的最大调用堆栈深度(你也能够改变该图形来替代显示 CPU 负载)。因 为它提供了可视化的方法,跟踪面板能够帮你发现代码中的趋势。重复模式能够显示 正在执行路径的类似代码。不一样部分的图形也能够显示它们当前正在作的事情。经过 单击感兴趣的区域,你能够开始使用详细面板分析数据。
你能够在详细面板里面对你的代码执行更深刻的分析。详细面板支持列表和大概 的视图模式。列表模式显示的是时间顺序的样本。你能够使用该列表来查看你应用程 序中代码在给定的地方作了什么。在大纲模式下,显示给你看的是有调用堆栈组织的 样本数据。在该视图下,你能够查看每一个线程的执行分支确认那个比其余拥有更多数 量的样本。扩展每一个线程可让你看到的独立的方法和函数,以及它们收集的样本数 据。为了一次性扩展整个层级结构,按下 Option 键并同时点击扩展三角形。
除了在线程的主入口点启动和查找重要的分支,你也能够反转调用树来在叶子节 点启动,并查看那个方法和函数被调用次数最多。反转调用树能够帮助你快速的识别 最可能频繁使用的方法和函数。你能够在这些叶子节点里面扩展调用树来查找谁调用 了该方法或函数,而且调用的次数。当你操做这些的时候,这会帮助显示给定方法或 函数运行时所花费的毫秒数,以便你能够关联样本的数量和函数使用的实际时间。 注意:尽管 Sampler instrument 报告给定分支所花费的时间,可是这些时间都是近似值。你能够 使用这些值来肯定程序所在地方花费的时间,可是不能拿这些值来做为性能指标来衡量你代码执 行的快慢。
扩展详细面板给你提供了样本数据的额外视图。在列表模式下,该面板显示了所 选择的样本收集的数据,包括样本被采集的时候全部运行线程的堆栈跟踪。在大纲模 式下,它显示了包含所选择的方法和函数的堆栈跟踪的深度。
刷选详细面板的内容
表 5-2 列出了你能够应用到由 Sampler instrument 收集的样本上的高级配置选
项。你使用这些选项来集中分析在特定时间发生的事件或涉及你代码特定部分的事
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [48]
件。
Instruments User Guide
Table 5-2 Configuration options for the Sampler instrument
Configuration section
Description
Choose between displaying all samples that were captured or only those that were captured while the specified thread (or threads) were running. Viewing all samples can give you a complete picture of the behavior of a thread over a period of time, including how much time was spent blocked or waiting for data. Viewing only the running samples provides an approximate picture of how much time was spent actually executing your code. (The actual running time may differ somewhat from the time reported by Instruments so you should use
the reported values only as a rough guide.)
Sample
Perspective
Choose these options to flatten or hide uninteresting parts of the call tree. You can separate out symbols that were gathered from different threads of execution, hide missing symbols or libraries, flatten branches of the call tree that contain recursive calls, and more. These options help you trim irrelevant portions of the call tree and organize the remaining data in
Call Tree
ways that make it easier to spot trends.
Choose the constraints for the data you want to view. You can use these configuration fields to prune the current data set. The Sampler instrument supports constraining data based on the number of samples gathered in a branch or the number of milliseconds spent executing
Call Tree
Constraints
a branch.
Choose the thread you want to analyze. Focusing on a specific thread displays only the samples for that thread, making it easier to see what the thread was doing. Viewing all
Active Thread
threads lets you see all of the work being performed by your application.
Call Tree 的配置选项提供了几个方法来在不删除任何样本数据的前提下删减调 用树。当你隐藏或夷平一组符号的时候,Sampler 会在样本里面一样隐藏这些调用函 数或方法的符号。这样可让你移除任何你不可控的代码,并集中于你本身的代码并 查看他执行所消耗的时间。
另外,Call Tree Constraints 实际上从视图里面移除了一组样原本让你集中于 你的知足特定条件的代码路径。例如,你可能使用一个基于时间的约束来集中于运行 时间至少消耗 100 毫秒的代码路径。
当你在一个 instrument 工具上面应用这些配置选项的时候,不要忘记你也能够 约束样本被收集的时候相应的样本数据。每一个跟踪文档里面的 Inspection Range 控 制器可让你查看特定样本点的数据。该特性和其余 instrument 工具的其余配置选 项组合使用。关于更多介绍如何使用 Inspection Range 控制器的信息,参阅“查看 一个时间范围的数据”部分。
5.2.2 使用Allocations Instrument工具分析数据
Allocations instrument 工具是一个跟踪全部由应用程序分配的内存的工具。所 以你能够使用那些信息来识别在你应用程序里面的内存分配模式,并识别你的应用程 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [49]
Instruments User Guide
序内存效率低下的地方。Allocations instrument 提供了和以前应用程序的 ObjectAlloc 同样甚至更好的数据修整和修剪设施。由于这整合在 Instruments 应用 环境里面,你也能够使用该 instrument 工具来关联你应用程序的内存行为到其余类 型的行为。
由于它跟踪整个应用程序生命周期的内存分配,你必须从 Instruments 应用里面 加载你的程序以便 Allocations instrument 工具能够收集它所须要的数据。在加载 的时候,Allocations instrument 使用系统中已有的挂钩(hooks)来记录与你应用程 序中分配和释放事件相关的信息,不管这些事件起源于系统标准分配入口仍是你本身 自定义的分配库。随着数据流的到来,instrument 更新并实时的向你显示内存是如 何被分配的。
Allocations instrument 能够工做在使用标准分配函数(如 malloc,calloc 或 free)的应用程序,并且也也能够工做在使用垃圾回收(garbage collected)的应用 程序上面。后一种状况,收集器依然调用 free 来释放 GC-aware(GC 感知)内存。 Allocations instrument 一样能够在构建在分配内存之上的例程里面工做,包括 Core Foundation 和 Cocoa 的内存分配例程。
注意:Allocations instrument 替代了 ObjectAlloc 应用程序,而 ObjectAlloc 应用程序在 Mac OS X v10.5 及其以后不可用。
分析对象分配的数据
Allocation instrument 工具的目的是为你显示你的应用程序如何使用内存。内
存是系统重要的资源,你应该明智的使用它。每一个内存分配都包含了直接成本和潜在 的长期成本。直接成本就是它分配内存所消耗的时间,包括建立新的虚拟内存页面和 把它们映射到物理内存上面。它也有可能包括把陈旧的内存页面写入硬盘。而从长远 来看,保持块状的物理内存可能触发系统额外的页面,这和其余页面操做同样可能对 系统性能损耗很大。
和全部工具同样,Allocation 工具开始的地方也是跟踪面板。默认配置下,跟踪 面板图形化你当前应用程序使用内存数量的净额。使用 instrument 的检查器,你可 以修改视图让它显示分配的密度,即内存分配发生的地方,或你也可让它显示堆栈 的深度。分配密度图可让你查看在你程序里面内存分配发生的频率。分配密度的尖
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [50]
Instruments User Guide
峰意味着潜在的瓶颈,而你能够经过预先分配块或减小对其余块的依赖来减缓该情 况。
不管你使用检查器的任何显示选项,跟踪面板默认状况下都会显示全部类型对象 的分配状况。为了集中于特定内存分配的子集,你能够使用详细面板来配置你想要在 跟踪面板图形显示的对象。为了集中于特定的对象类型或块大小,打开详细面板并把 它设置为列表模式(table mode)。在该模式下,详细面板经过对象类型和大小对内 存分配进行排序。图形的列包含了复选框可让你想要选择图形化的对象。取消全部 Allocations 的复选框(默认状况下就是这样),而后选择其余对象类型的复选框来 相应更新跟踪面板。若是你勾选了多个复选框,Allocations instrument 会为图形 生成不一样颜色的层。
详细面板(列表模式下)显示其余有用的信息来帮你发现潜在的分配问题。列表 中总体分配的净分配的列显示了当前活动对象和它有史以来建立数量的直方图。随着
净分配占总体分配比例缩小,直方图的条形颜色会跟着改变。蓝色的直方图条形代 表了合理的比例,而当改变为红色时意味着比例下降,可能须要核查一下。
尽管列表模式对于你得到内存分配的全局图很是有帮助,可是详细面板集合了三 个视图模式的优势。表 5-3 描述了每一个模式的显示信息和你如何使用这些模式来发现 问题。
Description
Table 5-3 Analyzing data in the Detail pane
Mode
Use this mode to see the summary of net versus overall allocations and to choose which objects you want to graph in the Track pane. Allocations in this mode are grouped by size or object type initially. Clicking the follow link button next to an object type takes you a level deeper by showing you the individual allocation events for that object. Clicking the follow link button again shows you
Table
the history of events that occurred at the same memory address.
Use this mode to see the call trees associated with allocated objects. Clicking the follow link button
Outline
next to an object type focuses on the call trees associated solely with that object type.
Use this mode to see all objects in the order in which they were allocated. Clicking the follow link button next to the object address shows the allocation events associated with that memory
Diagram
address.
Allocations instrument 的扩展详细面板主要显示了所选择的分配事件的堆栈 信息。对于某些分配事件,该面板也显示了关于事件的描述,包括事件的类型和大小, 和对象的引用数(retain count)。该信息能够帮你在你的代码中定位事件。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [51]
Instruments User Guide
跟踪引用数的事件
当你把 Allocations instrument 添加到你的文档里面的时候,它的初始化配置
是只记录内存的分配和释放的事件。默认状况下,它不会记录引用数的事件,好比 CFRetain 和 CFRelease 的调用。缘由是记录引用数的事件会给从进程里面收集数据 增长了额外的开销,并且在大部状况是不须要的。然而若是你的代码发生内存泄露, 你可能想要配置 Allocations instrument 来记录这些事件做为你努力追查泄露的一 部分。特别是,你能够查看任何不匹配的 retain 和 release 的事件来查看一个对象 是否最后引用被删除了而它仍然保留着。
注意:随着“Record referenc counts”选项被设置,Allocations instrument 在模板文档里面 查找内存泄露地方,这会帮助你追踪到内存的泄露。
过滤详细面板的内容
表 5-4 列出了高级的配置选项,你能够应用它们到 Allocations instrument 记
录的事件上面。你使用这些选项来集中于分析特定时间发生的事件,或涉及你代码的 特定部分。全部的这些选项仅当使用大纲或图形模式查看数据的时候才可用。在列表 模式下,Allocations instrument 显示全部分配的历史记录。
Table 5-4 Configuration options for the Allocations instrument
Configuration section
Description
Allocation
Choose between displaying all allocation events and those associated with objects that still
Lifespan
exist.
Call Tree
Choose these options to flatten or hide uninteresting parts of the call tree. You can separate out memory blocks based on which thread allocated them, hide allocations made by system libraries, show allocations made from Objective-C calls only , and more. These options help you trim irrelevant portions of the call tree and organize the remaining data in ways that
make it easier to spot trends.
Choose the constraints for the data you want to view. You can use these configuration fields to prune the current data set. The Allocations instrument supports constraining data based
Call Tree
Constraints
on the number of allocations made for a given type or the size (in bytes) of the allocations.
当你应用一个 instrument 的配置选项的时候,不要忘记你也能够限制样本数据 基于这些样本什么时候被收集。每一个跟踪文档里面的 Inspection Range 控件可让你查 看特定样本点的数据。该特性和其余 instrument 的配置选项组合使用。关于更多如 何使用 Inspection Range 控件的信息,参阅“查看一个时间范围的数据”部分。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [52]
Instruments User Guide
5.2.3 查找内存泄露
Leaks instrument 提供了和使用 leaks 命令行工具同样的检测泄露的能力。这个 instrument 分析你程序代码里面不在被引用而又正在使用的内存块。不被引用的内 存块也被视为“leaks”,由于它们不能再被你的应用程序释放,并且一直占用内存 空间直到程序退出。
为了你应用程序消除内存泄露是提升你程序可靠性的重要一步。这对于设计为长 时间运行的程序尤其正确。泄露会提升你程序总的内存占用空间,这会引起分页。程 序若是持续的发生内存泄露有可能没法完成它们的任何操做,由于它们没法分配必须 的内存。在极端状况下,程序有可能受损以致于崩溃。
Leaks instrument 记录你程序中全部发生分配内存的事件,并且周期性的搜索程 序可写内存,寄存器,和任何活跃内存块的栈引用。若是在这些地方找到一个没有对 于引用的内存块,它会告知缓冲区发生了一个泄露,并在详细面板里面显示相关的信 息。
在详细面板里面,你能够使用列表和大纲模式来查看泄露的内存块。在列表模式 下,Instruments 应用显示了泄露块的彻底列表,它按照大小排序。点击内存地址旁 边的如下的 Link 按钮,显示在该地址的内存块分配的历史,最终分配事件中没有匹 配的自由事件到显示最多。选择其中任何一个分配事件,将会在扩展详细面板上面显 示堆栈跟踪和关于该内存块的通用信息。在大纲模式下,Leaks instrument 显示了 由调用树组织的泄露。你能够使用该模式来找出在你代码中特定的分支有多少的内存 泄露。选择一个分支会在扩展详细面板里面显示该分支的代码路径深度。
表 5-5 列出了 Leaks instrument 的配置选项。这些选项的大部分会影响查看泄 露的相关信息,而部分会影响泄露缓冲区是如何被报告的。
Table 5-5 Configuration options for the Leaks instrument
Configuration option
Description
Leaks
Use the available option to enable automatic leak detection and to gather the contents
Configuration
of leaked memory blocks when a leak occurs.
Sampling Options
Use the specified field to set the frequency of automatic leak-detection checks.
Leaks Status
Displays the time until the next automatic leak-detection pass.
Check Manually
Use the provided button to initiate a check for memory leaks.
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [53]
Instruments User Guide
Call Tree |
![]() ![]() ![]() Choose these options to flatten or hide uninteresting parts of the call tree. You can hide allocations made by system libraries, show allocations made from Objective-C calls only, and more. These options help you manage the size of the call tree and organize it ![]() in ways that make it easier to spot trends. |
关于 leaks 命令行工具的信息,参阅 leaks 主页。
5.2.4 分析Core Data应用程序
对于使用了 Core Data 来管理它们底层数据模型的应用程序,Instruments 应用 提供了几个和 Core Data 相关的 instruments 工具来分析潜在的性能问题。这些 instruments 工具可让你洞察 Core Data 背后发生的事情,帮你识别你程序中没有 提取或有效保存数据的地方。表 5-6 列出了提供的 instruments 工具和如何使用没一 个。
Table 5-6 Core Data instrument usage
Instrument
Description
Use this instrument to find a balance between saving data too often and not saving it enough. Saving too often can lead to I/O overhead as your program writes data frequently to the disk. Conversely, saving infrequently can increase the application’s
Core Data Saves
memory overhead and lead to paging.
Use this instrument to optimize the data your application reads from disk. Fetch operations that take a long time might be improved by adding more specific predicates to retrieve only the data needed at that moment. Alternatively, if you notice gaps of inactivity followed by a large number of fetch requests, you might want to use those
Core Data Fetches
gaps to prefetch data that you know will be needed later.
Use this instrument to track the lazy initialization of an NSManagedObject or its to-many relationship. Object faults can be mitigated by prefetching the object itself or the objects
Core Data Faulting
to which it is related.
Core Data Cache
Use this instrument to locate potential performance issues caused by cache misses. Data not found in the caches must be fetched from the disk. Prefetching objects during relatively quiet periods can help mitigate cache misses by ensuring the required objects
Misses
are already in memory.
使用 Core Data 模板新建的跟踪文档包含 Core Data Fetches,Core Data Cache Misses,和 Core Data Save instruments 工具.当你分析你的 Core Data 应用程序的 时候推荐使用该模板。
关于更多调节 Core Data 应用程序的信息,参阅 Core Data Programming Guide。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [54]
Instruments User Guide
第六章 保存和导入跟踪数据
Instruments 提供了几个保存 instrument 工具和跟踪数据的方法。对于一个给定 的 Instruments 应用的文档窗口,你能够保存你已经记录的文档的跟踪数据,或者你 能够保存文档的 instrument 工具的配置信息。保存跟踪数据可让你维护一个你应 用程序性能随着时间变化的记录。保存文档配置信息避免你每次运行 Instruments 应用都须要从新建立一个通用的配置。
如下部分解析了如何保存一个跟踪文档,并导出其余格式的跟踪数据给其余应用 使用。
6.1 保存跟踪文档
在开发周期里面,你可能须要经过在你的程序上面运行一组固定的 instruments 工具来收集多个点的数据。以其每次运行 Instruments 应用的时候重复配置一组相同 的 instruments 工具,你能够一次性的配置跟踪文档,而后保存它的跟踪模板。选择 File > Save As Template 来保存你文档当前使用的 instruments 工具和配置(包括 任何用户界面轨迹)为一个模板。
跟踪模板的文档和你新建一个文档时出现的 Instruments 模板不同。你打开跟 踪模板和打开其余 instruments 文档的方式相同,都经过选择 File > Open。当你打 开一个跟踪模板时,Instruments 应用会使用该模板配置来建立一个没有任何数据的 跟踪文档。
Xcode 支持使用自定义的跟踪模板来启动你的应用程序。为了把你的跟踪模板添 加到 Xcode 的 Run 菜单,找到本地系统下/Users/<username>/Library/Application Support/Instruments/Templates 目录下面的模板。选择 Run > Start with Performance Tool 菜单来打开它。
6.2 导出跟踪数据
Instruments 应用可让你把跟踪数据导出为 CSV 的文件格式。该文件格式被大 部分应用程序支持。好比,你可能保存你的跟踪数据为该文件格式以便你能够把它导 入到电子表格的应用程序。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [55]
Instruments User Guide
为了保存你的跟踪数据为 CSV 文件,选项 Instruments 应用的 Instrument > Exprot Data for:<Instrument Name>。Instruments 应用将会导出该文档近期运行 的数据。
注意:并不是全部的 instruments 工具都支持导出为 CSV 的文件。
6.3 从Sample工具中导入数据
若是你使用 sample 的命令行工具来对你的程序执行进行统计分析。你能够导入 你的样本数据并使用 Instruments 应用来查看它们。从 sample 工具中导入数据会新 建一个新的使用 Sampler instrument 的跟踪文档,并把数据加载到详细面板。由于 样本并无包含时间戳信息,全部你只能在详细面板里面使用大纲模式来查看数据。 虽然你能够应用 Call Tree 配置选项到你的 Sampler instrument 来修整(trim)样 本数据,可是你不能够使用 Call Tree Constraints 或 Inspection Range 控件来裁 剪(prune)你的样本数据。
为了导入数据,选择 File > Import Data。Instruments 应用会提示你选择一个 包含样本数据的文本文件。而后它会建立一个基于你所选择的文件的跟踪文档。
6.4 使用DTrace数据
你若是你跟踪一个包含自定义 instruments 工具的文档,你能够导出这些 instruments 工具底层的脚本,并使用 dtrace 命令行工具来运行它们。运行脚本后, 你能够从新导入结果数据进 Instruments 应用里面。关于更多如何使用这些的信息, 参阅“导出 DTrace 脚本”部分。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [56]
Instruments User Guide
第七章 使用DTrace建立自定义instruments工具
Instruments 应用里面内置的 instruments 工具提供了大量关于程序内部工做的 信息。然而有时候你可能想要定制收集和你代码更加相关的信息。好比,以其函数每 次调用的时候都收集数据,你可能想要设置条件来决定什么时候收集数据。另外,你可能 想要在你的代码里面进行比内置 instruments 工具更深刻的研究。在这些状况下, Instruments 应用容许你建立自定义的 instruments 工具。
自定义 instruments 工具使用 DTrace 来实现。DTrace 是最初由 Sun 建立和移植 到 Mac OS X v10.5 的一个动态追踪工具。因为 DTrace 深刻操做系统内核,因此你可 以访问内核自己或你计算机上运行的进程的底层的操做。许多内置的 instruments 工具都是基于 DTrace 的。并且虽然 DTrace 自己就是一个很是强大和复杂的工具, Instruments 应用给你访问这个强大的 DTrace 工具提供了一个套简单的接口,而无 需太复杂的操做。
DTrace 并无移植到了 iOS 上面,因此不能在运行在 iOS 设备上面的应用建立自 定义的 instrument 工具。
重要:虽然自定义的 Instrument Builder 简化了建立 DTrace 探测器的过程,你仍然要比较熟悉 DTrace,并在建立新的 instrument 时了解它是如何工做的。许多强大的调试和数据收集动做需 要你本身写 DTrace 脚本。为了学习 DTrace 和 D 脚本语言(D scription language),参阅 OpenSolaris website 上面的 Solaris Dynamic Tracing Guide。关于更多 dtrace 命令行工具的 信息,参阅 dtrace 主页。
注意:部分 Apple 的应用程序(iTunes,DVD Player 和 Front Row)和使用 QuickTime 的应用程 序为了包含敏感数据不容许使用 DTrace 来收集数据(不管是临时的仍是持久性的)。因此,你不 应该在执行整个系统的数据收集时运行这些应用程序。
如下部分介绍了如何建立一个自定义的 instrument 工具,和如何在 Instruments 应用和 dtrace 命令行工具里面配合使用这些 instrument 工具。
7.1 关于自定义instruments工具
自定义 instruments 工具使用 DTrace 探针(probe)。探针(probe)是一个就像
是在你的代码里面放置了一个传感器。它响应 DTrace 能够绑定的位置和事件,好比
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [57]
Instruments User Guide
函数的主入口。当函数执行或事件产生的时候,相关的探针会被触发,且 DTrace 运 行任何和探针相关的动做。大部分 DTrace 的动做只是简单的收集关于操做系统的数 据和用户程序此刻的行为。然而能够运行一个自定义脚本做为动做的一部分。脚本可 以让你使用 DTrace 的特性来微调你收集的数据。
每次遇到探针的时候它都会触发,可是和探针相关的动做不须要在探针每次触发 的时候运行。断言(predicate)是一个可让你限制探针动做什么时候运行的条件状态。 好比,你能够限制一个探针到指定的进程或用户,或你能够在你 instrument 里面指 定的条件为真的时候运行动做。默认状况下,探针不包含任何断言,意味着探针每次 触发的时候相关的动做将会运行。然而你能够添加任何数量的断言到探针里面,使用 AND 和 OR 操做符来链接它们构成一个复杂的决策树。
一个 instruments 工具由如下几部分构成:
一个描述部分,包含了instrument的名称、类别和描述
一个或多个探针,每一个包含了和它相关的动做和断言
一个DATA声明区域,你能够使用它来声明全部探针共享的全局变量
一个 BEGIN 脚本,它初始化任何全局变量,并执行任何 instrument 所需的启动
任务
一个END脚本,它执行任何最后清理的动做
全部的 instruments 工具都应该包含起码一个探针和它相关的动做。相似的,所 有的 instruments 工具都应该包含一个合适的名称和描述来标识它们。Instruments 应用会在库窗口里面显示你的 instruments 工具的描述。好的描述能够更容易记住该 instruments 工具是作什么的和应该如何使用它。
不须要在全局数据或开始和结束脚本里面包含探针。这些元素都是用于设计先进 的 instrument 工具,当你相应在多个探针之间共享数据或给你的 instrument 提供一 些有序的初始化配置。建立 DATA,BEGIN 和 END 块会在“写自定义脚本的建议”部分 介绍。
7.2 建立自定义的Instrument工具
为了建立一个自定义的 DTrace 的 instrument 工具,选择 Instrument > Build New
Instrument(你也能够选择你跟踪文档下面的 Action menu 里面 Add Instrument >
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [58]
Instruments User Guide
DTrace Instrument 来执行相同的动做)。该命令显示了 instrument 配置表,如图 7-1 所示。你能够使用该表来指定你的 instrument 工具的信息,包括任何探针和自定义 脚本。
Figure 7-1 The instrument configuration sheet
你最少应该为你建立的每一个 instrument 提供如下信息:
名称(Name),在库里面你的自定义instrument工具的相关名称。
类别(Category),是你的 Instrument 工具出如今库里面的类别。你能够指定一
个已有的类别,好比内存(Memory),或者建立一个你本身的类别。
描述(Descritpion),该Instrument工具的描述,用于库窗口里面和instrument
的帮助标签里面。
探针提供者(Probe provider),包括探针的类别和它什么时候触发的详细信息。一般
包含了探针应用的指定方法或函数。关于更多信息,参阅“指定探针提供者”。
探针动做(Probeaction),当你探针触发时须要记录的数据或者须要执行的脚本。
参阅“添加动做到探针”部分。
一个 instrument 工具应该包含起码一个探针,且能够包含多个。探针的定义包 含了提供者信息,断言信息,和动做。全部的探针都必须指定起码一个提供者的信息, 而且几乎全部的探针都定义某种有序动做。探针定义的断言是可选的,可是它对于让
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [59]
Instruments User Guide
你的 instrument 工具集中于正确的数据很是有帮助。 7.2.1 添加和删除探针
每一个新的 instrument 工具都伴随一个你配置的探针。你能够在 instrument 配置 表的底部点击(+)按钮来添加多个探针。
为了从你的 instrument 工具里面删除一个探针,你能够单击选择探针并按下(-) 按钮。
当添加探针的时候,最好给探针提供一个描述的名称。默认状况下,Instruments 应用经过使用像“Probe 1”和“Probe 2”这样的名称来枚举探针。
7.2.2 指定探针的提供者
为了指定一个触发探针的位置或事件,你必须关联一个探针到它的合理的提供 者。提供者(Providers)是内核模块,它是 DTrace 的代理,提供了建立探针所须要的 instrument 信息。你不须要知道提供者是如何建立 instrument 的,你只须要知道每 个提供者的基本能力。表 7-1 列出了在 Instruments 应用建立自定义 instrument 工 具所支持的提供者。提供者的列列出在 instrument 配置表所示的名称,而 DTrace 提供者列列出在相应的 DTrace 脚本里面使用的提供者的名称。
Table 7-1 DTrace providers
Provider
DTrace provider
Description
The probe fires on entry (or return) of the specified function in your code. You must provide the function name and the name of the library that
User Process
pid
contains it.
The probe fires on entry (or return) of the specified Objective-C method.
Objective-C
objc
You must provide the method name and the class to which it belongs.
The probe fires on entry (or return) of the specified system library
System Call
syscall
function.
The probe fires when DTrace itself enters a BEGIN, END, or ERROR
DTrace
DTrace
block.
Kernel Function
fbt
Boundaries
The probe fires on entry (or return) of the specified kernel function in your code. You must provide the kernel function name and the name of
the library that contains it.
Mach
mach_trap
The probe fires on entry (or return) of the specified Mach library function.
The probe fires regularly at the specified time interval on each core of the machine. Profile probes can fire with a granularity that ranges from
Profile
profile
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [60]
Instruments User Guide
![]() microseconds to days. |
||
Tick |
tick |
![]() The probe fires at periodic intervals on one core of the machine. Tick probes can fire with a granularity that ranges from microseconds to days. You might use this provider to perform periodic tasks that are not ![]() required to be on a particular core. |
I/O |
io |
![]() The probe fires at the start of the specified kernel routine. For a list of functions monitored by this probe, use the dtrace ‐l command from Terminal to get a list of probe points. You can then search this list for ![]() probes monitored by the io module. |
Kernel Process |
proc |
![]() The probe fires on the initiation of one of several kernel-level routines. ![]() For a list of functions monitored by this probe, use the dtrace ‐lcommand from Terminal to get a list of probe points. You can then ![]() search this list for functions monitored by the proc module. |
![]() User-Level ![]() Synchronization |
plockstat |
![]() The probe fires at one of several synchronization points. You can use ![]() this provider to monitor mutex and read-write lock events. |
Core Data |
CoreData |
![]() The probe fires at one of several Core Data–specific events. For a list of methods monitored by this probe, use the dtrace ‐l command from Terminal to get a list of probe points. You can then search this list for ![]() methods monitored by the CoreData module. |
Ruby |
ruby |
![]() The probe fires at one of several Ruby-specific events. |
在你为你的探针选定了提供者后,你须要指定探针旁边的相关信息。对于函数级 别的探针,它可能须要输入函数或方法的名称和代码模块或包含它的类。部分提供者 可能只要简单的从弹出菜单里面选择包含相应的事件便可。
你配置完一个探针后,你能够继续增长额外的断言(来肯定它什么时候触发)或你可 以继续为探针定义动做。
7.2.3 给探针添加断言
断言可让你控制一个探针的动做什么时候被 Instruments 应用执行。你能够使用它 们来防止 Instruments 应用收集那些你不关心或有误的数据。好比,若是你的代码只 当堆栈达到必定的深度才表现出不寻常的行为,你能够使用一个断言来指定目标堆栈 的最低深度。每次探针触发的时候,Instruments 应用都会断定相关的断言。仅当它 们断定为真的时候,DTrace 才会执行相关的动做。
你能够经过点击探针行最后面的(+)的按钮来添加一个断言到探针。Instruments 应用会添加一个断言到探针里面,如图 7-2 所示。你随后能够经过使用探针或断言后 面(+)按钮来添加一个新的断言。你能够经过单击断言旁边的(-)按钮来删除一个断 言。为了从新排列断言,能够点击断言的右边侧的空白地方并把它拖拉到新的位置。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [61]
Instruments User Guide
Figure 7-2 Adding a predicate
Instruments 应用按照断言从上到下的顺序来判断。你能够使用 AND 和 OR 操做符 来链接断言,可是不能把它们分组来建立嵌套的条件块。相反,你必须谨慎的给你的 断言排序并保证全部的断言条件都被检查。
断言行的第一个弹出框让那你选择做为检测条件一部分的数据。表 7-2 列出了由 DTrace 定义的标准的变量,你能够在你的断言或脚本里面使用它们。该变量列列出 了它在 instrument 配置面板出现的名称,而 DTrace 变量列列出了变量在相应 DTrace 脚本使用的事件名称。除了标准变量,你能够测试自定义变量和你脚本里面在断言处 指定自定义变量类型的常量。
Table 7-2 DTrace variables
Variable
DTrace variable
Description
The value of the current thread’s program counter just before
Caller
caller
entering the probe. This variable contains an integer value.
The identifier for the physical chip executing the probe. This is a 0-based integer indicating the index of the current core. For
Chip
chip
example, a four core machine has cores 0 through 3.
The identifier for the CPU executing the probe. This is a 0-based integer indicating the index of the current core. For
CPU
cpu
example, a four core machine has cores 0 through 3.
Current Working
The current working directory of the current process. This
Directory
cwd
variable contains a string value.
The error value returned by the last system call made on the
Last Error #
errno
current thread. This variable contains an integer value.
The name that was passed to exec to execute the current
Executable
execname
process. This variable contains a string value.
The real user ID of the current process. This variable contains
User ID
uid
an integer value.
Group ID
gid
The real group ID of the current process. This variable
contains an integer value.
The process ID of the current process. This variable contains
Process ID
pid
an integer value.
The process ID of the parent process. This variable contains
Parent ID
ppid
an integer value.
The thread ID of the current thread. This is the same value
Thread ID
tid
returned by the pthread_self function.
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [62]
Instruments User Guide
![]() Interrupt Priority ![]() Level |
ipl |
![]()
|
||
Function |
probefunc |
![]() The function name part of the probe’s description. This ![]() variable contains a string value. |
||
Module |
probemod |
![]() The module name part of the probe’s description. This ![]() variable contains a string value. |
||
Name |
probename |
![]() The name portion of the probe’s description. This variable ![]() contains a string value. |
||
Provider |
probeprov |
![]() The provider name part of the probe’s description. This ![]() variable contains a string value. |
||
Root Directory |
root |
![]() The root directory of the process. This variable contains a ![]() string value. |
||
Stack Depth |
stackdepth |
|
||
![]() Relative ![]() Timestamp |
timestamp |
![]() The current value of the system’s timestamp counter, measured in nanoseconds. Because this counter increments from an arbitrary point in the past, you should use it to calculate only relative time differences. This variable contains ![]() an unsigned 64-bit integer value. |
||
Virtual Timestamp |
vtimestamp |
![]() The amount of time the current thread has been running, measured in nanoseconds. This value does not include time spent in DTrace predicates and actions. This variable ![]() contains an unsigned 64-bit integer value. |
||
Timestamp |
walltimestamp/1000 |
![]() The current number of nanoseconds that have elapsed since 00:00 Universal coordinated Time, January 1, 1970. This ![]() variable contains an unsigned 64-bit integer value. |
||
arg0througharg9 |
arg0 through arg9 |
![]() The first 10 arguments to the probe represented as raw 64-bit integers. If fewer than ten arguments were passed to the ![]() probe, the remaining variables contain the value 0. |
||
Custom |
![]() The name of your ![]() variable |
![]() ![]() Use this option to specify a variable or constant from one of ![]() your scripts. |
除了条件变量,你还必须指定比较运算符和目标的值。
7.2.4 给探针添加动做
当 instrument 工具定义的一个探针点被激活时,而且探针的断言条件判断为真, DTrace 将会运行探针相关的动做。你使用探针的动做来收集数据或执行额外的处理。 好比,若是你的探针监视一个特定的函数或方法,你可让它方法函数的 caller 和 任何 Instrument 堆栈跟踪信息。若是你想要一个稍微更高级的动做,你能够使用脚 本变量来跟踪函数被调用的次数,并报告该信息。并且若是你想要更加高级的动做, 你能够使用内核级别的 DTrace 函数来编写脚原本肯定你函数使用的一个锁的状态。 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [63]
Instruments User Guide
在后面那种状况,你的脚本代码一样可能返回锁当前的拥有者(若是有的话)来帮助 你肯定代码中不一样线程间的交互。
图 7-3 显示了 instrument 配置表的部份内容,在这里你能够指定你探针的动做。 该脚本只是简单的包含了一个文本区域来为你脚本代码肯定类型(Instruments 应用 在把它传递给 DTrace 以前不会验证你的代码,因此你要仔细的检查你的代码)。底下 部分包含了你想要在 instruments 工具里面 DTrace 返回的数据的控件。你能够使用 弹出菜单来配置一个你想要返回的内置的 DTrace 变量。你也能够在弹出菜单里面选 择自定义类型并返回一个你本身的脚本变量。
Figure 7-3 Configuring a probe’s action
当你配置你的 instrument 工具返回一个自定义变量时,Instruments 应用会要你 提供如下的信息:
包含数据的脚本变量
在你的instrument工具接口上面给变量赋值的名称
变量的类型
你的探针返回给 Instruments 应用的任何数据都会被收集并显示在 instruments 工具的详细面板上面。详细面板显示全部的数据变量,不管它的类型是什么。一旦堆 栈信息对一个特定的探针可用,Instruments 应用会在你的 instruments 工具的扩展 详细面板上面显示该信息。此外,Instruments 应用会自动的查找由你 Instrument 工具返回的整型数据并把这些类型添加到显示在跟踪面板上面的分析列表里面。
由于 DTrace 脚本运行在内核空间,而 Instruments 应用运行在用户空间,若是 你想要返回一个自定义指针类型的脚本变量的值给 Instruments 应用,你必须建立一 个缓冲区来存储这些变量的数据。建立缓冲区最简单的方式是使用 DTrace 里面的 copyin 或 copyinstr 子程序。copyinstr 子程序须要一个 C 字符串指针的参数,并返 回一个字符串内容形式,你能够把该字符串返回给 Instruments 应用。相似的,copyin
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [64]
Instruments User Guide
子程序须要一个指针和指针大小的参数,并返回一个缓冲区的数据,你能够在之后使 用 stringof 关键字格式来把它转换为一个字符串。这两个子程序都是 DTrace 环境的 一部分,而且能够被使用在你探针动做定义代码里面的任何部分。好比,为了从 C 风格的指针返回一个字符串,你须要简单的使用 copyinstr 子程序来封装该变量,如 图 7-4 所示。
Figure 7-4 Returning a string pointer
重要:Instruments 应用会自动使用 copyinstr 来封装内置的变量(好比 arg0 到 arg9 的函数参 数),前提是该变量类型被设置为 String。而后,它不会对你脚本的自定义变量作一样的操做。 你负责确保你自定义变量里面的数据匹配该变量指定的类型。
关于 Instruments 应用支持的内置变量,参阅表 7-2。关于脚本和脚本变量的更 多信息,参阅“编写自定义脚本的提示”部分。关于 DTrace 子程序的更多信息,包 括 copyin 和 copyinstr 子程序,参阅 OpenSolaris 上的 Solaris Dynamic Tracing Guide。
7.2.5 编写自定义脚本的提示
你能够使用 D 脚本语言来编写 DTrace 脚本,它们的语法是 C 编程语言的一个大 子集。D 语言结合了 C 语言编程结构的特殊函数和变量来帮助你在程序里面跟踪信息。
如下部分描述了几个在你自定义 instruments 工具里面使用脚本的通用形式。然 而它们不提供对 D 语言的全面预留,也不提供编写 DTrace 脚本的过程。关于脚本和 D 语言的信息,参阅 OpenSolaris website 上面的 Solaris Dynamic Tracing Guide。
7.2.6 编写BEGIN和END脚本
若是你想在你的动做触发的时候不仅是返回 DTrace 内置变量信息给 Instruments 应用,那么你须要编写自定义脚本。脚本能够在内核级别直接和 DTrace 交互,提供访问关于内核和活跃进程的底层信息。大部分 instruments 工具使用脚本 来收集 DTrace 不容易提供的信息。你也能够使用脚本在数据返回给 Instruments 应 用时操纵原始数据。好比,若是你想要更容易的和 instruments 跟踪面板的其余值比 较,你能够使用脚原本格式化一个特定范围的数据值。 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [65]
Instruments User Guide
在 Instruments 应用里面,自定义 instrument 工具的配置表提供了几个你能够 编写 DTrace 脚本的区域:
DATA部分包含了任何你想要在instrument工具里面使用的全局变量的定义。
BEGIN部分包含了你的instrument工具里面的代码的初始化。
每一个探针包含了它的动做的脚本代码。
END部分包含了清理你instrument工具的任何代码。
全部脚本区域都是可选的。你不须要必定包含脚本初始化代码或清理 instrument 工具的代码(若是你的 instrument 工具不须要的话)。然而若是你的 instrument 工 具在它的 DATA 部分定义了全局变量,推荐你提供初始化代码来设置这些全局变量为 已知的值。D 语言不容许你在全局变量声明的时候内联的指定值,全部你必须在 BEGIN 部分给它们赋值。好比,DATA 部分可能简单的由一个变量声明构成,以下:
相应的 BEGIN 部分可能包含如下对变量初始化的代码:
若是你相应的探针动做改变了 myVariable 的值,你可能须要在你探针的 END 部 分格式化并打印出变量的最终值。
你的大部分脚本均可能和单独的探针相关联。每一个探针包含一个和它动做相关的 脚本。当是时候执行探针动做的时候,DTrace 首先会运行你的代码,而后返回任何 要求的数据给 Instruments 应用。由于传递数据回 Instruments 应用包括从内核空间 拷贝数据到 Instruments 应用的程序空间,所以你应该老是经过在“Record the following data:”部分的 instruments 配置表里面配置合适的实体来传递数据返回 给 Instruments 应用。在你的脚本代码里面人工返回的变量有可能没法正确的返回给 Instruments 应用。
7.2.7 从自定义脚本里面访问内核数据
由于 DTrace 脚本在系统的内核执行,它们能够访问内核的字符。若是你想要在 自定义 instruments 工具里面查看内核全局变量和数据结构,你能够在你的 DTrace 脚本里面执行这些操做。为了访问内核变量,你必须在变量名称前面加一个反引符 (~)。反引号字符告知 DTrace 查找当前脚本以外的指定变量。
int myVariable;
myVariable = 0;
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [66]
Instruments User Guide
列表 7-1 显示了一个动做脚本样本,它从内核变量 avenrun 检索当前加载信息, 使用这些变量来计算系统平均加载的平均事件。若是你打算使用 Profile provider 来建立一个探针,你能够使用这个脚原本周期性的收集加载数据,而后在 Instruments 应用里面图示化该信息。
7.2.8 变量做用域
DTrace 脚本有一个基本扁平的结构,由于缺少流程控制语句,并且其设计为了保 证探针的执行时间最小化。然而 DTrace 脚本里面的变量,根据你的需求划分到不一样 的做用域。表 7-3 列出了这些变量的做用域级别,和在每一个级别使用这些变量的语法。
Listing 7-1 Accessing kernel variables from a DTrace script
this->load1a = `avenrun[0]/1000;
this->load1b = ((`avenrun[0] % 1000) * 100) / 1000;
this->load1 = (100 * this->load1a) + this->load1b;
Table 7-3 Variable scope in DTrace scripts
Scope
Syntax example
Description
Global variables are identified simply using the variable name. All probe
Global
myGlobal = 1;
actions on all system threads have access to variables in this space.
self‐>myThreadVar
Thread-local variables are dereferenced from the self keyword. All probe actions running on the same thread have access to variables in this space. You might use this scope to collect data over the course of several
Thread
= 1;
runs of a probe’s action on the current thread.
this‐>myLocalVar =
Probe-local variables are dereferenced using the this keyword. Only the current running probe has access to variables in this space. Typically, you use this scope to define temporary variables that you want the kernel to
Probe
1;
clean up when the current action ends.
7.2.9 查找脚本错误
若是你的自定义 instruments 工具的脚本代码包含一个错误,当你使用 DTrace 边缘该脚本的时候,Instruments 应用会在跟踪面板显示该错误的信息。Instruments 应用在你在你的跟踪文档里面按下 Record 按钮但跟踪又没有真正开始的时候报告你 该错误。在错误消息的气泡里面包含了一个编辑按钮。单击该按钮来打开 instrument 工具的配置表,它此刻会标识探针的一个错误。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [67]
Instruments User Guide
7.3 导出DTrace脚本
尽管 Instruments 应用提供了很方便的接口来收集跟踪数据,可是不少时候直接 使用 DTrace 来收集数据会更加方便。例如,若是你是一个系统管理员,或者正在编 写自动化测试脚本,你可能更喜欢使用 DTrace 命令行接口来加载一个进程并收集数 据。然而,使用命令行工具要求你编写本身的 DTrace 脚本,该脚本可能很费时甚至 出现不少错误。若是你已经拥有了一个包含一个或多个基于 DTrace 的 instrument 工具的跟踪文档,你能够使用 Instruments 应用程序来生成一个 DTrace 脚本,该脚 本和你在跟踪文档里面的 instruments 工具提供了相同的行为。
Instruments 应用只支持那些全部 instruments 工具都是基于 DTrace 的文档导出 DTrace 脚本。这意味着你的文档能够包含自定义 instruments 工具和少数内置 instruments 工具(好比库窗口中 File System 和 CoreData 组的 instruments 工具)。 关于一个 instrument 工具是不是基于 DTrace,请参考“内置 instruments 工具”的 介绍。
为了导出一个 DTrace 脚本,选中包含 instruments 工具的跟踪文档,选择 File > DTrace Script Export。该命令为你的 instruments 工具把脚本放入了一个文本文件, 它和你使用带有-s 选项的 dtrace 的命令工具建立的文本文件同样。好比,若是你导 出一个名为 MyInstrumentsScript.d 的脚本,你可能要在终端运行如下命令:
注意:大部分状况下你必须使用超级用户的权限来运行 dtrace,这是为何 sudo 命令会在上面的 例子中被放在 dtrace 的前面。
为你的 Instruments 应用导出你脚本文件(相对应手动编写)的另外一个优点是在 你运行脚本后,你能够导入结果数据到 Instruments 应用里面,并评审它。从 Instruments 应用导出的脚本会打印一个开始标志(<dtrace_output_begin>)在 dtrace 输出文件的开头。为为了收集数据,简单的拷贝全部 DTrace 在终端输出的信 息,并把它粘贴到文本文件里面,或者简单的在 dtrace 命令后面重定向输出到一个 文件里面。为了导入 Instruments 应用的数据,选中生成原始脚本的跟踪文档,并选 择 File > DTrace Data Import。
sudo dtrace -s MyInstrumentsScript.d
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [68]
Instruments User Guide
第八章 内置instruments工具
Instruments 应用里面内置了许多 intruemtns 工具。每一个 instrument 工具都包 含它本身的配置选项和显示信息的方式,及收集合适的数据类型。内置的 instruments 工具按照它收集的数据类型分组为少数几个类别。如下个部分更详细的 描述了内置 instruments 工具。
8.1 Core Data Instruments[Core Data相关]
如下的 instruments 工具收集的数据和 Core Data 应用的事件相关。你能够使用 这些 instruments 工具返回的信息来评估各类事件对应用性能的影响和来定位潜在 问题并修复它。
8.1.1 Core Data Saves
Core Data Saves instrument 工具记录了 Core Data 应用中保存的操做。该 instrument 工具能够在单一进程或全部当前系统运行的进程中执行操做。它只为这 些使用 Core Data 的进程记录数据。该 instrument 工具在它的实现上使用了 DTrace, 并能够导入一个 DTrace 脚本。
详细面板的样本数据
该 instrument 工具捕获如下信息:
Caller(调用者) 启动保存操做的方法的名称(包括栈跟踪信息)。
Save duration(保存耗时) 保存的耗时时间,以微秒为单位。
跟踪面板的显示项 跟踪面板能够被设置来显式如下任一信息数据:
Stack depth(栈深度) 栈调用的深度。
Thread ID(线程 ID) 线程标示符。
Save duration(保存耗时) 保存操做的消耗时间。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [69]
Instruments User Guide
扩展详细面板的补充数据 对于详细面板的每一个事件,你能够打开对应的扩展详细面板来查看它的栈调用的
跟踪和事件发生的对应时间。
8.1.2 Core Data Fetches
Core Data Fetches instrument 工具记录 Core Data 应用中提取保存数据的操做。 该 instrument 工具能够运行在单一进程或全部系统当前运行的进程之上。它只会记 录使用 Core Data 的进程的数据。该 instrument 工具在实现上使用了 DTrace,并可 以导入 DTrace 脚本。
详细面板的样本数据
该 instruments 工具捕获如下信息:
Caller(调用者) 启动提取操做的方法名(包括栈跟踪信息)。
Fetch entity(提取的条目) 被提取的条目的名称。
Fetch count(提取总数) 提取条目的总数。
Fetch duration(提取耗时) 提取操做消耗的时长,以微秒为单位。
跟踪面板的显式项 能够设置跟踪面板来显式如下任何的数据:
Stack depth(栈深度) 栈调用的深度。
Thread ID(线程 ID) 线程标示符。
Fetch count(提取总数) 提取条目的总数。
Fetch duration(保存耗时) 提取操做的消耗时间。
扩展详细面板的补充数据 对于详细面板的条目,你能够打开它对于的扩展详细面板来查看调用的栈信息和
对应事件发生的时间。
8.1.3 Core Data Faults
Core Data Faults instrument 工具记录 NSManagedObject 或它的一对多关系的 延迟初始化过程当中发生的故障事件。该 instrument 工具能够运行在单一进程或全部 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [70]
Instruments User Guide
系统当前运行的进程上面。它只收集使用了 Core Data 的进程的数据。该 instrument 工具的实现使用了 DTrace,并能够导入 DTrace 脚本。
详细面板的样本数据
该 instruments 工具捕获如下信息:
Caller(调用者) 触发故障的操做的方法名(包括栈跟踪信息)。
Fault object(故障对象) 引起故障的对象的名称。
Fault duration(故障耗时) 故障处理例程的执行时长(以微秒为单位)。
Relationship fault source(相关故障源)
Relationship(相关关系) 关系名称。
Relationship fault duration(相关故障的耗时)
单位)。
跟踪面板的显式项 能够设置跟踪面板来显式如下任何的数据:
Stack depth(栈深度) 栈调用的深度。
Thread ID(线程 ID) 线程标示符。
Fault duration(故障耗时)
Relationship fault duration(相关故障的耗时)
扩展详细面板的补充数据 对于详细面板的条目,你能够打开它对于的扩展详细面板来查看调用的栈信息和
对应事件发生的时间。
8.1.4 Core Data Cache Misses
Core Data Cache Misses instrument 工具记录高速缓存未命中致使的故障事件。 该 instrument 工具能够运行在单一进程或全部系统当前运行的进程上面。它只记录 使用了 Core Data 的进程。该 intrument 工具的实现使用了 DTrace,并能够导入 DTrace 脚本。
注意:该 instrument 工具提供了 Core Data Fault instrument 工具提供的行为的一个子集, 可是它对你分析整个应用程序的性能更有帮助。 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [71]
相关故障的耗时(以微秒为
RCM duration (相关高速缓存未命中耗时) 秒为单位)。
跟踪面板的显式项 能够设置跟踪面板来显式如下任何的数据:
相关高速缓存未命中的耗时(以微
Instruments User Guide
详细面板的样本数据
该 instruments 工具捕获如下信息:
Caller(调用者) 触发高速缓存未命中的方法名(包括栈跟踪信息)。
Cache Miss(高速缓存未命中) 引起高速缓存未命中的对象的名称。
CM duration(高速缓存未命中的耗时) 故障处理例程执行所用时长(以微为单
位)。
RCM source(相关高速缓存未命中源) 高速缓存未命中的相关源。
RCM Relationship(相关高速缓存未命中关系) 关系名称。
Stack depth(栈深度) 栈调用的深度。
Thread ID(线程 ID) 线程标示符。
CM duration(高速缓存未命中耗时) 如上。
RCM duration(相关高速缓存未命中耗时) 如上。
扩展详细面板的补充数据 对于详细面板的条目,你能够打开它对于的扩展详细面板来查看调用的栈信息和
对应事件发生的时间。
8.2 Dispatch Instruments[并发相关]
该 instrument 工具收集和 Grand Central Dispatch(GCD)相关的数据。GCD 是实 现并发执行异步任务的技术。GCD 在 Mac OS X v10.6 及其以后可用,在 iOS 上面不 可用。
为了高效使用 Dispatch instrument 工具,你须要对 GCD 的队列和 block 对象比 较熟悉。关于更多信息,参阅 Concurrency Programming Guide(并发编程指南)。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [72]
Instruments User Guide
8.2.1 Dispatch
Dispatch instrument 工具捕获由你应用程序建立的 GCD 队列和在这些队列上执 行的 block 对象的信息。它向你展现了应用程序队列和 block 对象执行的行为。它记 录队列的生命周期,和跟踪 block 的调用和执行的时间。
Dispatch 帮助你微调 blocks 的执行。它向你展现了那个 block 执行的次数最多 和它们占用了多久 CPU 时间来执行。你能够找到这些你已经放入队列执行的 blocks 的热点并优化这些 blocks 的代码。你也能够找到队列中同步执行的 blocks 的状况。 (GCD 队列在工做异步执行的时候能够更高效的执行)。
Dispatch 运行在当个进程上面。该 instrument 工具的实现使用了 DTrace,可是 Dispatch 的跟踪数据不能被导入到一个 DTrace 脚本里面。
对于详细面板的条目,你能够打开对于的扩展详细面板来查看栈跟踪的调用信 息,和这些事件发生的对应时间。
Dispatch 提供了几种跟踪数据查看的方式。主要的查看模式有队列视图(queues view)、调用树视图(call tree view)、块视图(blocks view)。默认视图是调用树视 图。你能够使用位于详细面板下面的按钮来显示三个主要视图的任何一种。
队列视图(Queues View)
队列视图显示应用程序建立的全部队列、在它们上面执行的 blocks 和相关的分
析。 队列视图显示如下信息:
Graph(图形)若是该选项被选中,Dispatchinstrument工具会在跟踪面板上面 显示该队列的直方图统计信息。
Queue Name(队列名称)队列建立的时候用户给它赋值的名称。队列全局名称是 有系统赋值的。
Conc(并行)Concurrent的缩写,代表该队列是并行的(而不是串行)。
Live(活跃)代表该队列是活跃的(还没被释放)。
#Blocks(块)当前被添加进入队列还没被调用的blocks的数量。
#Sync(同步)已经被同步调度的blocks的数量。
Total Processed(总处理)已经被执行了的 blocks 的数量。 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [73]
Instruments User Guide
Latency(潜伏期)blocks 待在队列的平均时间(以微秒为单位)。换而言之,调 用时间和进入队列时间之间的差别。
TotalCPUTime(总CPU时间)指定队列的blocks在CPU上面执行的总时间(以 微秒为单位)。
你能够在跟踪面板上面选择显示一个或多个队列的数据。跟踪面板能够被设置来 显示如下任何的数据:
Blocks Processed(已处理的块)特定时间周期被处理的 blocks 的数量。默认
时间周期为 10 微秒。
Block Count(块数)特定的时间周期内当前仍在队列里面 blocks 的数量。
CPU Usage(CPU 占有率)特定周期内 CPU 的活跃程度。
Work Time(工做时间)特定时间周期内队列的 blocks 消耗的 CPU 总时间。
Latency(潜伏期)特定周期内block的平均潜伏期(以微秒为单位)。
对于队列视图上面显示的每一个队列,你能够单击它的焦点按钮来查看已经添加进 入队列的 blocks 和使用队列调用了的 blocks 的列表。若是你比较在意你的 blocks 执行的顺序或你想要得到栈跟踪的详细视图的话,该队列视图是颇有帮助的。你能够 选中一个 block,并在扩展详细面板上面查看该 block 入队列和调用的栈跟踪信息。
调用树视图(Call Tree View) 调用树视图集合了全部栈跟踪和显示它们的调用树。若是你经过队列划分调用
树,你能够查看那个队列是最活跃和有最多 blocks 被调用。 调用树视图显示如下的信息:
%Calls(调用百分比)当前栈跟踪已经出现的调用百分比。
#Calls(调用次数)当前栈跟踪已经出现的次数。
Library(库)栈跟踪出现所在的framework或bundle的名称。
Symbol Name(符合名)栈跟踪的帧标示符。
跟踪面板能够被设置来显示如下的数据:
Blocks Invoked(Blocks 调用)特定周期内指定调用类型的 blocks 的数量。
Total Work Time(总工做时间)特定周期内 blocks 的消耗的总 CPU 时间。
对于调用树视图的每一个符号,你能够单击它的焦点按钮来修整的其他的树来集中
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [74]
Instruments User Guide
于你关注的节点和它的子节点。你能够选中一个 block 并在扩展详细面板上面查看该 block 最重要的栈跟踪信息。
Blocks视图(Blocks View)
Blocks 视图显示 block 和队列的信息。该视图显示全部在队列上下文被执行的
blocks,包括没有被显式入队列的。好比,若是 block A 被添加入队列而且此时执行 block B,那么这两个 block 都会被显示在 Blocks 视图上面,可是只有 block A 被显 示在队列视图上面(Queues View)。
Blocks 视图显示如下信息:
Graph(图形)若是该选项被选中,该instrument工具会在跟踪面板上面显示该
block 的直方图统计信息。
Blocks Name(Blocks 名称)编译器给 block 赋值的名称。
Block Library(Blocks 库)Block 声明所在的 framework 或 bundle。
Total Work Time(总工做时间)该 block 的全部调用的中的执行时间(以微秒
为单位)。
AverageWorkTime(平均工做时间)该block的平均执行时间(以微秒为单位)。
Count(调用次数)该block被调用的次数。
该 block 的扩展详细面板显示了最多调用栈跟踪的信息。该 Block 在该栈跟踪里 面常常被调用。
你能够在跟踪面板上面选择显示一个或多个 blocks 的数据信息。跟踪面板能够 被设置来显示如下的数据:
Blocks Invoked(Blocks 调用)特定周期内指定调用类型的 blocks 的数量。
Total Work Time(总工做时间)特定周期内 blocks 消耗的总的 CPU 时间。
对于 Blocks 视图里面每一个 block,你能够单击它的焦点按钮来查看一列使用来执 行 block 的队列。对于每一个队列,你能够单击它的焦点按钮来查看和该队列相关的一 列 blocks。若是你关注那个 blocks 被队列的上下文调用和它们相应的执行顺序的话, 那个 Blocks 视图将很是有帮助。
8.3 Energy Diagnositics Instruments[电池诊断相关]
此部分的相关 instruments 工具提供了 iOS 设备上面关于能量使用的诊断。它们
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [75]
Instruments User Guide
同时测量设备主原价的开 - 关的状态。
iOS 设备在使用电池电源和外部电源的具备不一样的表现行为。这会影响在这些
instruments 工具上面收集到的数据。特别是 Energy Usage instrument 工具被影响 到。但设备链接到外部电源的时候,它不会影响测试能量使用(Energy Usage)状况。
如下是这些 instruments 工具的典型工做流程:
链接设备到你的开发环境。
启动Xcode或Instruments应用。
在设备上面,选择Settings>Developers,并打开电源日志(powerlogging)。
断开设备,并执行所需的测试。
从新链接设备。
在 Instruments 应用里面打开 Energy Diagnostics 模板。
选择 File > Import Eneryg Diagnostics from Device。
当你执行下面操做的时候,电量诊断的数据会被清空:
关闭设备的电源日志。
断开设备并重启。
电池电量消耗完成。
8.3.1 电量使用(Energy Usage)
Energy Usage instrument 工具测量设备启动后的电量使用。该 instrument 工具 提供了大量工做流程的宏观测量。时间刻度对于比较运行的不一样颇有帮助。电源事件 (标志)以编程方式添加。
详细视图将会显示如下的信息:
Energy Usage Level(电量使用级别)在刻度 0-20 之间的相关电量使用。
Power Source Events(电源事件)电池或外部电源的转换。
注意:Energy Usage instrument 工具当前支持 iPhone 3GS 和第三代 iPod touch 及以上的 设备。
8.3.2 CPU 活动(CPU Acitivity)
CPU Activity instrument 工具给出了一个设备在作什么的指示。该 instrument
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [76]
Instruments User Guide
工具提供了一个 Activity Monitor instrumentation 的简明版本。 详细视图显示了如下信息:
Time(时间)测量的时间间隔。
Total Activity(总活动)CPU 活动的百分比。
Foreground App Activity(前台应用的活动)前台应用程序的活动的百分比。
Audio Processing(音频处理)音频活动的百分比。
Graphics(图形)图形活动的百分比。
App Activity(应用活动)应用状态切换。
8.3.3 显示亮度(Display Brightness)
Display Brightness instrument 工具记录影响电量使用的亮度的改变状况。该 instrument 工具不会记录由于环境光传感器形成的亮度改变事件。
你能够设置屏幕的默认亮度,经过选择 Settings > Brightness。当屏幕开启, 记录跳转到预设的水平。当屏幕关闭时,记录降低到零。
8.3.4 休眠/唤醒(Sleep/Wake)
若是设备正在运行,这 Sleep/Wake instrument 工具会显示一个红色带,但若是 设备正处于休眠状态,或试图进入休眠状态,或重休眠状态中唤醒时,它则显示一个 较深颜色的频段。在休眠期间,电量测量会显示为零。该 instrument 工具对相关的 instruments 工具很是有帮助。
8.3.5 蓝牙(Bluetooth)
若是蓝牙开启可用时,Bluetooth instrument 工具会显示一个红色频段,不然如
果蓝牙关闭时,这显示一个黑色频段。
8.3.6 无线(WiFi)
若是 WiFi 启用的时候,WiFi instrument 工具显示一个红色的频段,不然若是
WiFi 关闭时,显示一个黑色频段。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [77]
Instruments User Guide
8.3.7 定位(GPS)
若是 GPS 启用时,GPS instrument 工具显示一个红色的频段,不然若是 GPS 关闭,
则显示一个黑色的频段。
8.4 File System Instruments[文件系统相关]
该部分的 instruments 工具分析文件系统的信息和活动,好比读和写操做,权限
等等。
8.4.1 I/O 活动(I/O Activity)
I/O Activity instrument 工具记录 I/O 事件:函数调用,好比在文件系统上面 的 read、write、open、close 等操做。你能够使用该 instrument 工具来启动和样本 分析单个运行在 iOS 设备上面的进程。尽管 I/O Activity instrument 工具提供了 一个调用树的回溯跟踪视图,在 Mac OS X 上有相似 I/O Activity instrument 工具 的 fs_usage 实用工具。
在详细面板,你能够选择如下的一个或多个类别。每一个类别包含了一组探针 (probes)(BSD 函数)。
File Attributes(文件属性)
getattrlist setattrlist listxattr
File Permissions(文件权限) chmod
fchmod chown fchown access
Open and Close(打开和关闭文件) open
fdopen 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [78]
Instruments User Guide
fopen freopen close fclose
Other(其余) lseek
fsync dup
dup2 link unlink
Read and Write(读写操做) read
pread readv write pwrite writev
Shared Memory(共享内存) shm_open
shm_unlink
Sockets(套接字)
recv
recvfrom recvmsg send
sendmsg sendto
Stats(统计) 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [79]
Instruments User Guide
lstat
lstat64
stat
stat64
fstat
fstat64
I/O Activity instrument 工具捕获如下信息:
Function(函数)被调用的函数的名称。
Duration(时长)函数调用的时长。
In File(输入文件)输入文件描述符。
In Bytes(输入字节)要求读或写的字节的数量。
Out File(输出文件)输出文件描述符。
Out Bytes(输出字节)实际读或写的字节数量。
Thread ID(线程 ID)线程的标示符。
Stack Depth(栈深度)函数调用期间使用的栈帧的数量。
Error(错误)函数调用期间最近出现的错误。
Path(路径)可执行文件执行操做的文件路径。
Parameters(参数)函数调用的参数。对于特定函数的参数的描述,参阅相应API
文档。
跟踪面板能够被设置来显示如下的数据信息:
Sample number(样本数量)
Call duration(调用时长)
Input file descriptor(输入文件描述符)
Input bytes(输入字节)
Output file descriptor(输出文件描述符)
Output bytes(输出字节)
Thread ID(线程 ID)
Stack depth(栈深度)
对于任何函数的调用,你能够打开该调用的对应扩展详细面板来查看整个调用的
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [80]
Instruments User Guide
回溯跟踪信息。该 instrument 工具还在详细面板提供了一个调用树视图。
I/O Activity instrument 工具某些时候被用来配合其余 iOS instruments 工具 使用。好比,你能够配合使用 I/O Activity instrument 工具和 OpenGL ES Driver
instrument 工具来检查纹理加载进程。
8.4.2 文件锁(File Locks)
File Locks instrument 工具记录调用 flock 函数时咨询文件锁的操做。该 instrument 工具能够运行在单个进程或全部当前系统运行的进程上面。该 instrument 工具的实现使用了 DTrace,并能够导入 DTrace 脚本。
该 instrument 工具捕获如下信息:
函数名称
函数调用者(包括可执行文件名称和栈跟踪信息)
锁住的文件路径
操做类型,它是一个整形变量,有如下相应的值(包括这些值的组合):
1 - 共享锁 2 - 独占锁
4 - 不阻塞锁
8 - 解锁 跟踪面板能够被设置来显示如下的数据:
栈深度(Stack depth)
线程 ID(Thread ID)
时间戳(Timestamp)
对于详细面板的条目,你能够在扩展详细面板打开该调用的栈跟踪信息,和任何 探针的信息、事件发生的时间。
8.4.3 文件属性(File Attributes)
File Attributes instrument 工具记录文件系统中文件的全部者和访问权限的改 变事件。该 instrument 工具能够运行在单个进程或全部当前系统运行的进程上面。 该 instrument 工具的实现使用了 DTrace,并能够导入 DTrace 脚本。该 instrument
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [81]
Instruments User Guide
工具关于每一个函数调用的如下信息:
经过chmod和fchmod函数修改的文件权限
经过chown和fchown函数修改文件全部者和所在的组
对于每一个函数调用,instrument 工具捕获如下信息:
函数的名称
函数的调用者(包括可执行文件的名称和栈跟踪信息)
可执行文件操做的文件路径
被修改的文件的文件描述符
模式标志,它指示了能够在文件上面应用的权限(该值只在调用fchmod的chomod
时才被捕获)
文件的新的全部者的用户ID(该值只在调用fchown的chown时才被捕获)
文件的新组的组ID(该值只在调用fchown的chown时才被捕获) 注意:关于模式标志的解析更多信息,参见 chmod 的主页。
跟踪面板能够被设置来显示如下的信息:
栈深度(Stack depth)
线程 ID(Thread ID)
文件描述符(File descriptor)
模式(Mode)
用户 ID(User ID)
组 ID(Gopup ID)
对于详细面板的条目,你能够在扩展详细面板打开该调用的栈跟踪信息,和任何 探针的信息、事件发生的时间。
8.4.4 文件活动(File Activity)
File Activity instrument 工具可让你监听文件的访问。该 instrument 工具 能够运行在单个进程或系统全部当前运行的进程之上。该 instrument 的实现使用了 DTrace,并能够导入 DTrace 脚本。该 instrument 工具捕获如下函数的调用信息: 打开和新建一个能够读取或写入的文件(open)
删除从每一个进程的引用表的描述符(close) 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [82]
Instruments User Guide
获取关于一个文件的信息(fstat) 对于每一个函数的调用,该 instrument 捕获如下的信息:
函数的名称
函数的调用者(包括可执行文件的名称和栈跟踪信息)
可执行文件操做的文件路径
文件的文件描述符
跟踪面板能够被设置来显示如下的数据:
栈深度(Stack depth)
线程 ID(Thread ID)
文件描述符(File descriptor)
对于详细面板的条目,你能够在扩展详细面板打开该调用的栈跟踪信息,和任何 可用探针的信息、事件发生的时间。
8.4.5 目录I/O(Directory I/O)
Directory I/O instrument 工具记录目录的相关操做,好比移动目录,建立符合 链接等等。该 instrument 工具能够运行在单个进程或全部当前系统运行的进程之上。 该 instrument 工具的实现使用了 DTrace,并能够导入 DTrace 脚本。该 instrument 工具捕获如下函数的调用信息:
delete - 删除一个文件和目录
link - 建立一个硬链接或符合链接
mkdir - 建立一个目录
mount - 挂载一个文件系统
rename - 修改一个文件或目录的名称
rmdir - 移除一个目录
symlink - 新建一个符合链接
unlink - 移除一个链接
unmount - 卸载一个文件系统
对于每一个函数的调用,该 instrument 捕获如下的信息:
函数的名称
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [83]
Instruments User Guide
函数的调用者(包括可执行文件的名称和栈跟踪信息) 可执行文件操做的文件或目录的路径 新文件或目录的名称(在适当状况下)
跟踪面板能够被设置来显示如下的数据: 栈深度(Stack depth)
线程 ID(Thread ID)
对于详细面板的条目,你能够在扩展详细面板打开该调用的栈跟踪信息,和任何 可用探针的信息、事件发生的时间。
8.5 Garbage Collection Instruments[垃圾回收相关]
该部分的 instruments 收集由垃圾回收器回收内存的信息。为了使用这些 instruments 工具,程序必须是创建在垃圾回收器之上并启用垃圾自动回收功能。关 于编写一个垃圾回收器的程序,参阅 Garbage Collection Programming Guide。
8.5.1 GC Total
GC Total instrument 工具追踪全部由垃圾回收器分配和释放的对象或字节的总 数量。该 instrument 工具能够运行在单个进程或全部当前系统运行的进程之上。该 instrument 工具的实现使用了 DTrace,并能够导入 DTrace 脚本。它记录只启用了垃 圾回收的进程的数据。
该 instrument 工具捕获如下信息: 对象初始化和回收函数(包括栈跟踪信息) 有垃圾回收器回收的对象的数量 由垃圾回收器回收的所有字节的数量 所有已分配且仍然使用中的本身数量 所有已经回收和正在使用中的字节的数量
跟踪面板能够被设置来显示如下数据: 栈深度(Stack depth)
线程 ID(Thread ID) 回收的对象(Objects reclaimed)
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [84]
该 instrument 工具捕获如下信息: 对象的初始化和回收函数(包括栈跟踪信息) 分配内存的区(zone) 事件是不是分代的(1为YES,0为NO) 由垃圾回收器回收的对象的数量 由垃圾回收器回收的字节的数量 清除时间的持续时间(以微秒为单位)
跟踪面板能够被设置来显示如下信息: 栈深度(Stack depth)
线程 ID(Thread ID)
区(Zone)
是否分代(Is generational)(分代回收器查找由非分代回收器错过的不在使用 的比较旧的对象,但它须要运行更长的时间,因此不常常运行) 回收的对象(Objects reclaimed)
回收的字节(Bytes reclaimed)
持续时间(Duration) 对于详细面板的条目,你能够在扩展详细面板打开该调用的栈跟踪信息,和任何
可用探针的信息、事件发生的时间。
Instruments User Guide
回收的字节(Bytes reclaimed) 正在使用的字节(Bytes in use) 所有字节(Total bytes)
对于详细面板的条目,你能够在扩展详细面板打开该调用的栈跟踪信息,和任何 可用探针的信息、事件发生的时间。
8.5.2 垃圾回收(Garbage Collection)
Garbage Collection instrument 工具测量垃圾回收器清除阶段的回收数据。该 instrument 工具能够运行在当个进程或全部当前系统运行的进程之上。该 instrument 工具的实现使用了 DTrace,并能够导入一个 DTrace 脚本。它只记录启动 了垃圾回收的进程的数据。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [85]
Instruments User Guide
8.6 Graphics Instruments[绘图相关] 该部分的 instruments 工具收集和绘图相关的数据。
8.6.1 核心动画(Core Animation)
Core Animation instrument 工具测量一个运行在 iOS 设备上面的进程每秒的核 心动画帧的数量,以及屏幕外的帧计数。
此外,Core Animation instrument 工具能够提供一个可视化的提示(hints)来帮 助你理解内容是如何被渲染到屏幕的。该 instrument 工具包含了许多可选的选项来 容许你选择特定类型的渲染提示(rendering hints)。提示工做在设备上的任何程序。 没有必要记录样本数据来激活提示。但你关闭 Instruments 文档或删除该 instrument 工具时,提示会被伴随关闭。若是有一个 OpenGL 的表层被显示,渲染提示不会影响 该表层。
该 instrument 工具包含如下的渲染提示:
着色混合层(Color Blended Layers),放置一个红色(red)的覆盖层在使用混合
绘画的图层上面。放置一个绿色(green)的覆盖层在不使用混合绘画的图层上面。
着色复印的图像(Color Copied Images),放置一个蓝绿色(cyan)的覆盖层在核
心动画复印的图像上面。
当即着色(ColorImmediately),执行着色刷新操做以后,不须要等待10毫秒。
着色未对齐的图像(Color Misaligned Images),放置一个洋红色(magenta)的
覆盖层在源像素不对齐目标像素的图像上面。
着色屏幕外渲染为黄色(Color Offscreen-Rendered Yellow),放置一个黄色的
覆盖层在屏幕外渲染的内容上面。
着色 OpenGL 快速路径为蓝色(Color OpenGL Fast Path Blue),放置一个蓝色
的覆盖层在从合成器分离的内容之上。
闪光更新的区域(Flash Updated Regions)屏幕闪光更新的区域为黄色。
你能够使用这些渲染提示来在不须要作必要绘图的时查找出没有改变的重绘内 容。
跟踪面板能够显示每秒的帧数。扩展详细面板显示每一个样本点的分析。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [86]
Instruments User Guide
8.6.2 OpenGL驱动器(OpenGL Driver)
OpenGL Driver instrument 工具样本分析 OpenGL 的统计信息。该 instrument 工 具能够运行在单个进程或全部当前系统运行的进程上面。
该 instrument 工具捕获如下信息:
交换缓冲区数(Buffer swap count)
客户端 OpenGL 等待时间(Client GLWait time)
每一个样本的 2D 指令字节(Command 2D Bytes per sample)
上下文 2D 的计数(Context 2D Count)
上下文 OpenGL 计数(Context GLCount)
上下文空闲缓冲区 2D 等待时间(Free Context Buffer 2D Wait time)
图形地址映射表的字节大小(Gart size bytes)- Gart 为 Graphics Address
Remapping Table
表层计数(Surface count)
纹理计数(Texture count)
显存空闲字节(Vram free bytes)- Vram 为 Video Random Access Memory
更多(and much more)
安装该 instrument 工具并打开扩展详细面板,来查看捕获数据的所有列表。 跟踪面板指示了那些数据被收集。扩展详细面板显示了每一个样本点的统计。
8.6.3 OpenGL ES驱动器(OpenGL ES Driver)
OpenGL ES Driver instrument 工具在 iOS 设备上查询 GPU 驱动器来给单独进程 进行 OpenGL 样本统计分析。该 instrument 工具帮你肯定你已经使用了设备的 OpenGL 和 GPU 的效率。
注意:Apple 已经售出各类 GPUs,每一个都有不一样的统计数据集。Instruments 应用在查询设 备以前是不知道有什么统计数据将要显示的。
GPU 的硬件由两部有效的组合:平铺器(Tiler)和渲染器(Renderer)。一个场景被 平铺并渲染。平铺器和渲染器组件一般工做在不一样的场景。每一个组件的利用率可能达 到 100%。
平铺器和渲染器利用率对于肯定瓶颈颇有帮助。渲染器利用率低下时意味着进程
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [87]
Instruments User Guide
正等待被平铺,此时下降场景的复杂度可能对缓解利用率问题。平铺器和渲染器利用 率低下时暗示程序的其余地方出现了瓶颈。
该 instrument 工具捕获如下信息:
上下文计数(ContextCount)全局OpenGL上下文的数量。须要注意的是能够有
其余运行的进程(好比,SpringBoard)负责建立一个上下文。这一统计分析可
以帮助你重点发现任何没有获得销毁的错误上下文。
命令缓冲区分配的字节数(Command Buffer Allocated Bytes)被分配用于存储
和提交命令缓冲区数据的字节数。该空间能够用来提交全部 OpenGL 命令和用户
指定的顶点数据。
命令缓冲区提交的字节数(Command Buffer Submitted Bytes)已经提交给驱动
器的命令缓冲区字节数。该数量包括全部 OpenGL 命令和用户指定的顶点数据。 每次提交时,已提交字节数(Submitted Bytes)会从总的内存量里面递增。你 可能须要经过它除以提交次数(Submit Count)所得的值来获取每次提交的评价 使用值(该平均值老是稍微少于分配的字节数,由于分配的大小就是实际使用的 边界)。
命令缓冲区提交的次数(Command Buffer Submit Count)驱动器处理的命令缓 冲区的次数。一个命令缓冲区也许包含多个渲染器和切换器。每一个命令缓冲区被 传给 GPU 时,该值会随着递增(每一个命令缓冲区可能包含零个或多个场景)。
命令缓冲区渲染的次数(Command Buffer Render Count)GPU 渲染的 3D 帧的数 量。
命令缓冲区切换次数(Command Buffer Transfer Count)驱动程序处理的交换 命令的显示次数。
渲染利用率%(Renderer Utilization %)GPU 花在执行分片处理的时间比例。
平铺器利用率%(Tiler Utilization %)GPU 花在顶点处理和平铺的时间比例。
设备利用率%(DeviceUtilization%)GPU花在执行一些平铺和渲染工做的时间
比例。
平铺场景的字节数(Tiled Scene Bytes)用于平铺场景的字节数。值越大意味
着场景越复杂。若是你的场景复杂到超出填充平铺场景的字节时,你能够使用分 割场景模式。但一般状况下你应该避免使用该模式。统计数据是由每一个场景递加
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [88]
Instruments User Guide
的。同时你须要使用字节数除以场景数。
分割场景数(Split Scene Count)一个场景的部分进入分割场景模式的次数。
但场景复杂度很高并且没法把整个场景填充进入一个平铺场景字节缓冲区的时 候,须要使用分割场景模式。分割的场景数和平铺场景字节数能够用来肯定渲染 的路径,并且你须要下降该路径的复杂度。更多的时候你应该避免使用分割场景。
资源字节数(Resource Bytes)用于纹理的字节数。
资源计数(Resource Count)使用中的纹理的数量。
每秒核心动画帧数(Core Animation Frames Per Second)核心动画每秒显示新
的合成帧的数量。这些帧可能包含了 CAEAGLLayer 对象的 OpenGL ES 帧。 跟踪面板指示数据什么时候被收集的。 由于事件不被捕获,因此在扩展详细面板上面没有相应的回溯跟踪。相反,扩展
详细面板显示了每一个样本点的统计分析的全列表。
8.6.4 OpenGL ES分析器(OpenGL ES Analyzer)
OpenGL ES Analyzer 是一个在测量和分析应用程序中 OpenGL ES 活动的 iOS instrument 工具。该 instrument 工具包含了一个专业系统,该系统查找问题并提供 基于 Apple 硬件和软件平台最近实践和复杂的知识。该 instrument 工具一样提供了 一个大量的性能统计分析。
应用程序每次调用 OpenGL ES 框架时,该 instrument 工具跟踪调用并记录时间、 时长、回溯跟踪和其余参数,并把信息更新到主机上。该 instrument 工具分析 OpenGL 命令流来计算有用的性能分析数据并驱动专业系统,而后反过来提供修正建议和性能 建议。
好比,该 instrument 工具可能会告诉你它检测到没有使用顶点缓冲区对象的顶 点数据数组。顶点数组是保存在主内存的客户端数据。若是把这些数据以顶点缓冲区 对象上传到 GPU 的话将会更加高效。尽管它的实现有点复杂,但性能提升是显著的。
该 instrument 工具提供如下视图:
帧统计(Frame statistics)对应图形的时间刻度。它会以表格形式呈现图形中
渲染的数据。
分析结果(Analysis findings)专业系统的建议,和扩展详细视图的栈跟踪。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [89]
Instruments User Guide
使用不一样的颜色来标示问题的严重性。你能够扩展子层来查看每一个建议的特定事
件,而后更深层的扩展来查看由建议产生的 OpenGL ES 命令的序列。
跟踪功能(Functiontrace)OpenGL命令的所有列表,和扩展详细视图的参数和
回溯跟踪。
API统计(APIstatistics)列出OpenGL调用惟一总时间和每次调用的平均时间。
调用树(Call tree)提供全部用户调用 OpenGL ES 或 EAGL 函数的导航,利用
instrument 工具的数据挖掘工具。 但你双击分析结果或跟踪功能的回溯跟踪符合时,将会显示相关的源码。 覆盖部分是用来绕过在图形管道的阶段。这可以让你隔离问题并找到你的代码中的
瓶颈。
注意:OpenGL ES Analyzer instrument 工具不支持 iPhone 3GS 和第三代 iPod touch 以前 的设备。
8.7 Input/Output Instruments[输入输出相关] 如下的 instrument 工具收集和 I/O 操做相关的数据。
8.7.1 读/写(Reads/Wirtes)
Reads/Writes instrument 工具记录文件的读取和写入操做。该 instrument 工具 能够运行在单个进程或系统当前运行的全部进程之上。该 instrument 工具的实现使 用了 DTrace,并能够导入 DTrace 脚本。它收集关于每一个读取和写入函数的相关信息, 包括 read、write、pread 和 pwrite。
该 instrument 工具捕获如下信息:
函数的名称
函数的调用者(包括可执行文件的名称和栈跟踪信息)
可执行文件操做的文件的路径
被修改文件的描述
读取或写入的字节树
跟踪面板能够被设置来显示如下的数据:
栈深度(Stack depth)
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [90]
Instruments User Guide
线程 ID(Thread ID)
文件描述符(File descriptor)
字节数(Bytes)
关于任何这些调用,你能够打开扩展详细面板来查看该调用的栈跟踪信息,和任 何可用探针的信息、事件发生的时间。
8.8 Master Tracks Instruments[界面操做跟踪相关] 主跟踪轨迹(Master Tracks)部分包含了用户界面的记录器,它可让你记录
并回放程序中用户的一系列动做。
8.8.1 用户界面(User Interface)
User Interface instrument 工具能够加载一个程序或附加到一个进程之上,并 记录你和界面之间的交互。你能够屡次回放这些记录,并运行任何其余你选择的 instruments 工具进行这样的操做。你能够使用该 instrument 工具来建立做为你质 量保证计划的一部分的用户界面的可重复测试,并捕获偶然发生的错误。User Interface instrument 工具的详细使用在“使用用户界面跟踪工做(Working with a User Interface Track)”部分介绍。
8.9 Memory Instruments[内存相关] 该部分的 instruments 工具跟踪内存使用状况。
8.9.1 共享内存(Shared Memory)
Shared Memory instrument 工具记录共享内存的打开和取消连接。该 instrument 工具能够运行在单个进程或系统当前正在运行的全部进程之上。该 instrument 工具 的实现使用了 DTrace 并能够导入 DTrace 脚本。它收集关于每一个共享内存的访问信息, 包括 shm_open 和 shm_unlink。
该 instrument 工具捕获如下信息:
函数的名称
函数的调用者(包括可执行文件的名称和栈跟踪信息) 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [91]
Instruments User Guide
共享内存区域的名称
用来打开共享内存区域的标记(查看shm_open主页)
模式标记,指示该共享区域的访问权限(查看chmod主页)
跟踪面板能够被设置来显示如下的数据:
栈深度(Stack depth)
线程 ID(Thread ID)
标志(Flags)
mode_t
关于任何这些调用,你能够打开扩展详细面板来查看该调用的栈跟踪信息,和任 何可用探针的信息、事件发生的时间。
8.9.2 分配内存(Allocations)
Allocations instrument 工具跟踪应用的内存分配状况。该 instrument 工具要 求你加载一个进程,以便它能收集进程开始以后的数据。
该 instrument 工具捕获如下信息:
类别(Category)一般是一个 Core Foundation 对象、Objective-C 类、或原始
内存块(block)。
净分配字节数(Net Bytes)当前已经分配内存可是仍然没有被释放的字节的总
数。
净分配数(#Net)当前已经分配内存但仍然没有被释放的对象或内存块的数量。
总分配字节数(Overall Bytes)全部已经分配内存,并且包括已经被释放了的
字节的总数。
总分配数(#Overall)全部当前已经分配内存,包括已经被释放了的对象或内存
块的总数。
净余或所有内存分配(#Allocations)当前和所有分配数的直方图。直方条一般
为蓝色。当对象总数和最大值之间的比例或最大值和当前分配数的比例少于1/3 时,直方条会被修改成黄色。当比例等于 1/10 或更少时,直方条变为红色。
尽管显示的比例不必定是坏事(一般它们在应用程序长期运行期间是正常),
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [92]
Instruments User Guide
Instruments 应用一般给它们标示不一样的颜色来指出分配模式以便进行进一步的研 究。若是你发现类别(categories)的颜色为红色或黄色,你可能须要尽可能消除应用 程序给定类型的非必要的临时内存分配。相似的,你可能只是简单的尽可能消除高水位 标记的对象的数量。
详细面板的数据表格包含了一个图形列,其中包含了表中的每一行的复选框。当 指定类别的复选框被勾选时,instrument 工具在跟踪面板里面显示特定类别的图形。 Instruments 应用一般给每一个图形类别赋一个颜色。
当你鼠标移动到详细面板上面的类别名称上时,会在类别名称的旁边显示一个更 多信息的按钮。单击该按钮会显示关于该类别上的对象的详细信息,包含如下属性:
块(block)地址。
函数调用或形成该分配事件的类。好比,你能够看到该类里面的那个方法对对象
进行了引用。
对象的建立时间。
负责建立对象的库。
对于任一这些事件,你能够打开扩展详细面板来查看每一个对象内存分配的栈跟 踪,包括分配的类型和事件发生的时间。
对于特定对象(或内存块)的实例,你能够单击该对象地址列的更多信息按钮来 查看对象相关的内存分配事件。对于每一个内存分配事件,该 instrument 工具显示以 下信息:
对象(它的类型)的类别
事件类型
每一个事件的时间戳
块地址
块的大小
负责分配块的库
引起分配事件的函数
对于任何分配事件,你能够打开扩展详细面板来查看栈跟踪信息,同时也能够查 看任何可用的事件信息和事件具体发生的时间。
为了进一步的过滤详细面板的信息,你能够配置 Allocation Lifespan options
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [93]
Instruments User Guide
(内存分配存活期选项)。这些选项可让你过滤基于如下标准的分配事件:
全部建立的对象(All Objects Created) - 显示全部对象,不管它们是否已经
被释放掉了。
已建立的&仍然有效的(Created & Still Living) - 仅显示当你中止记录时仍
然存在内存的对象。
Allocations instrument 工具的检查器可让你配置 instrument 工具跟踪信息 的方法。你能够从该检查器设置一下选项:
记录引用数。使用该选项来跟踪每一个对象的引用计数。
中止时丢弃未被记录的数据。使用该选项来丢弃任何已经被收集了的当还没被
Allocations instrument 工具处理的数据。
关于 Allocations instrument 工具的更多额外信息,参阅“使用 Allocations Instrument 工具分析数据(Analyzing Data with the Allocations Instrument)”。
8.9.3 内存泄露(Leaks)
Leaks instrument 工具检查进程堆泄露的内存。你能够使用该 instrument 工具 配合 Allocations instrument 工具来获取内存地址的历史记录。该 instrument 工具 要求你加载一个进程以便它能够从进程启动时收集数据。
该 instrument 工具捕获如下信息:
内存泄露的数量(The number of leaks)
每一个泄露内存块的大小(The size of each leak)
泄露内存块的地址(Address of the leaked block)
泄露对象的类型(Type of the leadked object)
详细面板的每一个视图模式以轻微不一样的函数显示泄露的数据。在列表模式下,该 instrument 工具显示每一个泄露的百分比,而每一个内存泄露有助于发现内存泄露的总 数。在大纲模式下,数据被重组以便你能够查看给定的符号有多少内存泄露。对于任 何模式的条目,在扩展详细面板显示内存泄露引起的深刻栈跟踪信息。
关于 Leaks instrument 工具的更多额外信息,参阅“查找内存泄露(Looking for Memory)”。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [94]
Instruments User Guide
8.10 System Instruments[系统相关]
该部分的 instruments 工具收集系统活动和资源的数据。
8.10.1时间分析器(Time Profiler)
Time Profiler instrument 工具在规定的间隔内中止一个 Mac OS X 的程序并记 录该程序内部线程的栈跟踪信息。你能够使用这些信息来肯定花费在你程序上面的执 行时间并提高你的代码来减小运行时间。不像不少 instruments 工具,Time Profiler 工具不须要使用 DTrace 探针来实现功能。Time Profiler 工具运行在单个进程或所 有进程之上。
在采样期间,该 instrument 工具捕获如下信息:
采样开始的时间
采样的时长
栈跟踪信息(包括库和调用者信息)
采样期间遇到的最大栈深度
采样期间遇到的最频繁的函数(热点帧)
Time Profiler 工具让你能够以不一样的方式来查看这些信息。在列表模式下,你 能够查看按照时间顺序采集的样本,它显示你代码执行的顺序。在大纲模式下,Time Profiler 提供了你程序调用栈的树形视图并显示了调用栈里对应调用函数的样本数 量。
为了显示一个函数的详细调用栈,你能够在大纲模式下扩展对应的项目或选择一 个函数并打开扩展详细面板。在大纲模式下,你能够经过单击 Option 键和条目的扩 展三角形来扩大给定条目的整个调用栈。
跟踪面板默认显示每一个样本时间点的栈深度。该视图对于肯定你代码执行的状况 颇有帮助。由于它不像两个不一样的执行路径结果产生相同的栈深度,当你查看图形的 重复结构时,它多是相同的代码被重复的执行。
Time Profiler 的一个特性是在没有真正运行 Instruments 应用也能够记录一个 分析信息(profile)。当你须要记录一个瞬间事件或它可能须要不少时间来打开并配 置 Instruments 应用时,该特性将会排上用场。为了以这种方式来记录一个分析文件, 首先你需求确保 Instruments 应用没有正在运行。按下 Dock 下的 Instruments 应用
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [95]
Instruments User Guide
的图标。Dock 将会显示一个菜单项,其包含了 Time Profiler 的命令、设置和分析 文件。你能够选择分析一个特定进程,全部进程,或自动分析任何阻塞的进程。在分 析文件建立后,它会出如今 Instruments 应用的 Dock 菜单里面的 Recent Time Profiles(最近时间分析文件)里面。Instruments 应用打开并显示分析数据。
Time Profiler instrument 工具和 Sampler instrument 工具备点相似,可是它 们之间也有不少的不一样:
TimeProfil以诈骗(Shark)的方式从内核空间收集回溯跟踪数据。而Sampler
工具从用户空间收集数据。所以,Time Profiler 在收集数据方面比 Sampler 工 具更高效。
注意:若是目标进程被优化来忽略帧指针,那么 Time Profiler(以 Shark 方式)可能 产生不许确的回溯跟踪数据。
Time Profiler 能够收集一个或多个进程的数据。Sampler 工具只能采集单一进 程。
Time Profiler 能够采集全部线程状态或只在当前运行的线程。Sampler 工具通 常采样全部线程状态。一般状况下,你可能只对正在运行的线程感兴趣。当你的 应用被挂起时,你须要检查全部线程的状态。
8.10.2旋转监控器(Spin Monitor)
Spin Monitor instrument 工具自动采样系统上无响应的应用程序。当一个应用 程序 3 秒或更长内没有从窗口服务器检索事件时,它将会变为无响应的应用程序。在 这段时间内没有响应的应用程序实际上可能会作一些有益的工做,也多是被挂起。 你能够该 instrument 工具生成的样本信息来修改你的代码以便保证你的程序能够一 直保持及时处理事件。该 instrument 工具能够运行在单个进程或系统当前运行的所 有进程之上。
在采样期间,该 instrument 工具捕获如下信息:
采样开始时间
采样的时长
栈跟踪信息(包括库和调用者信息)
采样期间遇到的最大栈深度
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [96]
Instruments User Guide
采样期间遇到的最频繁的函数(热帧) 详细面板的每一个视图模式以细微不一样的方式显示样本数据。列表模式和大纲模式
开始时显示此期间那个应用程序被采样的会话。每一个会话负责一个时间段,该时间段 内应用程序被认定为无响应,而你能够扩展给定的会话来查看此时应用程序在作什 么。在列表模式下,instrument 工具显示了采样期间最频繁调用的函数相关的数据。 在大纲模式下,instrument 工具显示每一个会话生成的样本的数量。你也能够使用 Sample Perspective 选项来显示样本运行的时间。
该 instrument 工具的检查器可让你设置收集样本的速率。默认状况下,该 instrument 工具每 10 毫秒收集一次样本。
8.10.3取样(Sampler)
Sampler instrument 工具在指定的时间间隔内中止一个应用程序并记录应用程 序每一个线程的栈跟踪信息。你能够使用这些信息来肯定花费你应用程序执行时间的地 方并提升你的代码来减小运行时间。不像许多 instruments 工具,Sampler instrument 工具不要求使用 DTrace 探针来实现功能。该 instrument 工具运行在单个进程之上。
Sampler instrument 工具记录每一个样本的如下数据类型:
被执行的函数
应用程序每一个线程的栈跟踪信息
样本被采集的时间
Sampler instrument 工具可让你以不一样的方式查看这些信息。在列表模式下, 你能够按照样本被采集的顺序来查看它们,它显示了你代码执行的顺序。在大纲模式 下,Sampler instrument 工具提供了你应用程序调用栈的树型视图,并显示了里面 每一个调用函数执行时的样本的数量。
在研究的一个正在运行程序的性能时,你应该比较函数的影响和函数的执行成 本。若是你的程序花费很长的时间来执行一个低影响的函数,该 instrument 工具可 以标记出该请状况。而后你能够使用样本数据来找出为什么你的程序会花费这些时间和 谁调用这些函数,经过这样你能够修复你的代码让它减小被调用的频率。
为了显示一个函数的详细调用栈,你能够在大纲模式下扩展相应项目或选择一个 函数,并打开扩展详细面板。在大纲模式下,你能够经过按下 Option 键和单击对于
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [97]
Instruments User Guide
条目扩展按钮来扩展一个给定条目的的所有调用栈。 跟踪面板默认显示每一个样本时间点的栈深度。该视图能够帮助识别你代码当前正
在作什么。由于两个不一样的执行路径不太可能产生相同的栈深度,因此当你看到图形 有重复的结构时,有多是同一代码被重复执行了。若是该段代码须要消耗很长时间 来执行,那它就是很好的优化目标。
关于 Sampler instrument 工具的额外信息,参阅“使用 Sampler Instrument 工 具分析数据部分(Analyzing Data with the Sampler Instrument)”。
8.10.4进程(Process)
Process instrument 工具记录由另外进程派生的进程。该 Instrument 工具能够 运行在单个进程或系统全部当前运行的进程之上。该 instrument 工具的实现使用了 DTrace,并能够导入 DTrace 脚本。
该 instrument 工具捕获如下信息:
执行一个进程(execve)
进程退出(exit)
Process instrument 工具返回这些函数每次调用的信息,包括:
函数名称(execve或exit)
函数调用者(包括可执行文件名称,路径,和栈跟踪信息)
进程ID
进程退出状态
跟踪面板能够被设置来显示如下任何数据:
栈深度(Stack depth)
线程 ID(Thread ID)
进程 ID(Process ID)
退出状态(Exit status)
对于任何调用,你能够打开扩展详细面板来查看该调用的栈跟踪,和任何可用的 探针信息和事件发生的具体时间。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [98]
Instruments User Guide
8.10.5网络活动监控器(Network Activity Monitor)
Network Activity Monitor instrument 工具记录电脑网络传输信息。该 instrument 工具能够运行在单个进程或系统当前全部运行的进程之上。
跟踪面板能够被设置来默认显示如下网络相关的数据,但你也能够配置它来显示 其余类型的数据。默认状况下,它显示如下信息:
每秒发送的字节数量
每秒收接收字节的数量
每秒发送包的数量
每秒接收包的数量
8.10.6内存监控器(Memory Monitor)
Memory Monitor instrument 工具记录进程使用的实际内存和虚拟内存的数量。 该 instrument 工具能够运行在单个进程或系统全部当前运行的进程之上。
跟踪面板能够被设置来默认显示如下内存相关的数据,但你也能够配置它来显示 其余类型的数据。默认状况下,它显示如下的信息:
虚拟内存页面交换进入的数量(virtual memory page ins)
虚拟内存页面交换出去的数量(virtual memory page outs)
正在使用的虚拟内存空间的总数量
空闲物理内存的总数量
已用物理内存的总数量
8.10.7硬盘监控器(Disk Monitor)
Disk Monitor instrument 工具记录硬盘的读取和写入操做。该 instrument 工具 能够运行在单个进程或系统全部当前运行的进程之上。
跟踪面板能够被设置来默认显示如下和硬盘相关的数据,但你也能够配置它来显 示其余类型的数据。默认状况下,它显示如下信息:
每秒写入硬盘的字节数量
每秒从硬盘读取的字节数量
每秒处理的写操做的数量
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [99]
Instruments User Guide
每秒处理的读操做的数量 8.10.8CPU监控器(CPU Monitor)
CPU Monitor instrument 工具记录系统的负载。该 instrument 工具能够运行在 单个进程或系统全部当前运行的进程之上。
跟踪面板能够被设置来默认显示如下负载值,但你也能够配置它来显示其余类型 的数据。默认状况下,它显示如下信息:
系统产生的负载的数量
用户产生的负载的数量
系统总负载
8.10.9活动监控器(Activity Monitor)
Activity Monitor instrument 记录由虚拟内存大小测量的系统负载。该 instrument 工具能够运行在单个进程或系统全部当前运行的进程之上。
跟踪面板能够被设置来默认显示如下的负载值,你也能够配置它来显示其余类型 的数据。默认状况下,它显示如下信息:
正在使用的虚拟内存控件的总量
系统产生的负载数量
用户产生的负载数量
系统总负载
8.11 Threads/Locks Instruments[线程相关] 如下 instruments 收集线程相关的数据。
8.11.1Java线程(Java Thread)
Java Thread instrument 工具记录 Java 线程的初始化和销毁。它显示:
每一个测量的时间
总线程数
你能够指定特定颜色标示线程运行时,等待,和阻塞的状态。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [100]
Instruments User Guide
8.12 UI Automation[界面自动化相关] 8.12.1使用Automation Instrument工具
Automation instrument 工具容许你让 iOS 应用的用户界面测试自动化。自动化 界面测试可让你:
省去关键人员和释放其余工做资源
执行更多综合测试
开发可重复的回归测试
减小程序错误
提升开发周期,产品更新
Automation instrument 工具由你的测试脚本指导,演示你应用的用户界面元素, 容许你记录分析结果。自动化功能能够模拟许多用户设备支持的用户操做,好比 iOS4.0 或更高版本支持的多任务。你的测试脚本能够运行在 iOS 设备和 iOS 模拟器 之上而不须要任何改动。
Automation instrument 工具的一个最大的好处是能够能够和其余 instruments 工具一块儿执行复杂的测试,好比跟踪内存泄露和隔离性能问题的缘由。 注意:为了保护,该 instrument 工具不容许你处理任何和你证书不相关的进程。这包括拷 贝任何在 iTunes App Store 下载的应用。 重要:模拟动做可能没法防止测试设备自动锁定屏幕。因此在设备上运行测试以前,你应该 设置设备的 Auto-Lock 偏好设置为 Never(设置->通用->自动锁定->永不)。
测试自动化脚本
你以 JavaScript 脚本的方式编写自动化测试,使用界面自动化 API 来指定在你
程序运行中应该执行的动做。 使用脚原本实现主动化测试能够减小开发和部署时间以及测试人员编程技巧的
要求。此外,JavaScript 提供了复杂程序来支持复杂的操做。
参阅 UI Automation Reference Collection 的 API 详情。 你的测试脚本必须是一个本机 Instrument 应用能够访问的合法的可执行
JavaScript 脚本文件。它在你的程序以外执行,因此你程序的测试版本能够和你提
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [101]
Instruments User Guide
交到 iTunes App Store 的版本相同。 你能够建立任意多的脚本,可是你同一时间只能运行一个脚本。API 提供一个
#import 的指导,它运行你编写较小,可重复使用的离散的测试脚本。好比,若是你
打算在一个文件里定义通用的函数 TestUtilities.js,你能够经过引入定义该函数
的脚本文件来使用这些函数。
#import “<path-to-library-folder>TestUtilities.js”
加载Automation Instrument工具
加载 Automation instrument 工具和其余内置的 instrument 工具备细微的不一样。
如下是执行的步骤:
启动Instrument应用。
选择Automation模板来建立一个跟踪文档。(可选的,你能够在Instrument应
用的工具库里的 UI Automation 组找到 Automation instrument 工具,并拖动它
到跟踪文档里面)。
确保详细视图被显示。(若是有必要选择 View > Detail)
在Target菜单里面选择目标iOS设备,而后从iOS应用程序里面列表选择你的
应用程序。
测试iOS模拟器里面的应用
当选择目标应用程序运行在 iOS 模拟器之上时,你可能须要经过导航栏里面的
Choose Target 文件浏览器选择目标应用程序,使用如下的本地路径
iOS version>/Applications/ 并替换<iOS version>为 iOS 实际版本号,好比图 8-1 中的 4。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [102]
Instruments User Guide
Figure 8-1 Targeting an application running in iOS Simulator
一旦选定了 iOS 模拟器上面的应用程序,有两个加载项将会变得可用。
Process I/O:传输 I/O 消息到 Instruments 应用控制台,系统控制台,或 /dev/null。
Simulator Configuration:选择目标硬件设备和 iOS 版本的组合。
运行Automation Instrument
为了运行 Automation instrument 工具,执行如下步骤:
若是有必要单击脚本的扩展三角形,显示面板主体内容。
单击 Choose Script。
在打开的面板里面,找到脚本文件并打开它。
单击Instruments工具栏的Record按钮。脚本日志条目将会出如今详细面板里
面。
单击扩展面板里面的任何脚本日志条目来在扩展详细面板里面显示该条目的更
多信息。
使用中止(stop)和开始(start)的控制按钮来中止/暂停和开始/恢复你测试
脚本序列的执行。
为了配置 Automation instrument 工具来自动化开始和中止你的脚本,能够经过
控制 Instruments 应用工具栏的 Record 按钮,选择 Run on Record 的复选框。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [103]
Instruments User Guide
若是你的应用程序崩溃了或进入后台,你的脚本将会被阻塞直到应用程序再次运 行在前台,此时脚本继续执行。
要注意,你必须显式的中止记录。完成或中断你的脚本都不会关闭记录。
8.12.2访问和操做用户界面元素
UI Automation 特性下的基础辅助机制(Accessibility-based)表明你应用程序 的每一个控制做为一个独特的可标示元素。为了在你应用程序的元素上面执行操做,你 须要显式的标识应用程序元素的层级结构。 注意:为了彻底理解本部份内容,你应该熟悉 iOS 人机交互指南(iOS Human Interface Guidelines)。
为了阐明元素的层级结构,本部分引用图 8-2 所示的 Recipes iOS 应用(食谱应 用),该应用能够在 iOS Dev Center 上面下载代码示例 iPhoneCoreDataRecipes。
Figure 8-2 The Recipes application (Recipes screen)
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [104]
Instruments User Guide
UI元素可访问性
每一个可访问的元素都是继承自基础元素 UIAElement。每一个元素均可以包含零个或
更多的其余元素。 以下文详细介绍,你的脚本能够访问每一个独立元素的在层级结构的位置。然而,
你能够经过在设置 Interface Builder 的可访问标签来给每一个元素所表明的控件赋值 一个特定的名称,如图 8-3 所示。
Figure 8-3 Setting the accessibility label in Interface Builder
UI Automation 使用可访问标签(若是它设置的话)来为每一个元素派生一个名字 属性。除了显而易见的好处,使用这样的名称能够大大简化你测试脚本的开发和维护。
名称属性是这些元素在你测试脚本里面很是有用的四个属性之一。
名称(name):派生自可访问标签
值(value):当前控件的值,好比,文本域的文字
子元素集(elements):当前元素所包含的任何子元素集,好比,列表视图的单
元格
父元素(parent):包含当前元素的父元素
理解元素的层级结构
在元素层级结构的顶层是 UIATarget 类,它表明了被测系统(System under Test-
SUT)高级用户界面元素,即设备(或模拟器)和运行在你设备之上的 iOS 和你的应
用程序。为了测试,你的应用程序必须是前台活跃程序(或目标程序),标识以下:
UIATarget.localTarget().frontMostApp();
为了得到应用窗口,和你应用的主窗口,你应该指定
; 开始时,食谱应用程序窗口如图 8-2 所示。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [105]
Instruments User Guide
在窗口内部,食谱列表表明了一个独立的视图,此时是一个列表视图(table view):
Figure 8-4 Recipes table view
它是你应用里面列表视图数组的第一个列表视图,因此你使用下标 0 来指定它
([0]),以下:
UIATarget.localTarget().frontMostApp().mainWindow().tableViews()[0];
在列表视图内部,每一个食谱由一个不一样的单元格表示。你能够以相似的方式指定
独立的单元格。好比,使用下标 0([0]),你能够指定第一个单元格以下:
UIATarget.localTarget().frontMostApp().mainWindow().tableViews()[0].cells()[0];
这些独立的单元格元素的每个都被设计做为自定义子元素来包含一个食谱记 录。在第一个单元格的记录是 chocolate cake,你能够使用下面的代码来访问它的 名称:
显示元素的层级结构
你能够使用 logElementTree 方法来显示每一个元素的全部子元素集。如下的代码
举例说明列出食谱应用的主界面的元素。
UIATarget.localTarget().frontMostApp().mainWindow().tableViews()[0].cells()[0].elements( |
“Chocolate Cake”); |
// List element hierarchy for the Recipes screen
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [106]
Instruments User Guide
![]() ![]() ![]() |
![]() UIALogger.logStart("Logging element tree ..."); |
![]() UIATarget.localTarget().logElementTree(); |
![]() ![]() UIALogger.logPass(); |
该命令的输出被 Automation instrument 工具捕获并日志输出,如图 8-5 所示。
Figure 8-5 Output from logElementTree method
注意到每一个元素开始的行项目的数量,意味它元素的在层级结构的级别。这些级 别能够被视为概念图,如图 8-6 所示。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [107]
Instruments User Guide
Figure 8-6 Element hierarchy (Recipes screen)
尽管屏幕技术上不算是 iOS 编程序组件,并且没有显式的出如今层级结构,但它 对于理解层级界面很是有帮助。轻击标签栏的 Unit Converion 标签显示 Unit Conversion 的屏幕,如图 8-7 所示。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [108]
Instruments User Guide
Figure 8-7 Recipes application (Unit Conversion screen)
如下代码轻击标签栏的 Unit Conversion 标签来显示相关的屏幕,并打印相关的 每一个元素的层级结构日志。
![]() ![]() ![]() // Switch screen (mode) based on value of variable |
![]() |
![]() var target = UIATarget.localTarget(); |
![]() var app = target.frontMostApp(); |
![]() var tabBar = app.mainWindow().tabBar(); |
![]() |
![]() var destinationScreen = "Recipes"; |
![]() |
![]() if (tabBar.selectedButton().name() != destinationScreen) { |
![]() tabBar.buttons()[destinationScreen].tap(); |
![]() } ![]() |
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [109]
Instruments User Guide
由此产生的日志输出层级结构,如图 8-8 所示。注意到和以前的例子相同, logElementTree 被目标调用,可是结果是当前屏幕,在该例中是 Unit Conversion 屏幕。
Figure 8-8 Element hierarchy (Unit Conversion screen)
指定元素层级结构导航 以前的例子代码介绍了使用变量来代码元素层级结构的部分。该技术能够在你的
脚本中使用更短,更简单的命令。 使用变量方式同时容许在你代码中使用和重用的抽象和灵活性。如下示例使用变
量(destinationScreen)来控制食谱应用程序里两个屏幕间的切换(Recipes 和 Unit Conversion)。
![]() ![]() ![]() // Switch screen (mode) based on value of variable |
![]() |
![]() var target = UIATarget.localTarget(); |
![]() var app = target.frontMostApp(); |
![]() var tabBar = app.mainWindow().tabBar(); |
![]() |
![]() var destinationScreen = "Recipes"; |
![]() |
![]() if (tabBar.selectedButton().name() != destinationScreen) { |
![]() tabBar.buttons()[destinationScreen].tap(); |
![]() } ![]() |
使用轻微的改变,也可以使该代码的代码工做,好比,对于标签工具栏包含多个标
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [110]
Instruments User Guide
签或不一样名称的标签。
执行用户界面手势 一旦你懂得若是访问所需的元素,那么操纵相应的元素就会相对简单和直接。UI
Automation API 接口提供了执行大部分 UIKit 用户动做的方法,包括多点触控手势。 关于这些方法的全面详细信息,参阅 UI Automation Reference Collection。
轻击(Tapping)
或许最经常使用的触摸手势就是简单的轻击。在一个已知的 UI 元素上面实现单指轻
击是很是简单的。好比,轻击食谱应用导航栏右边的按钮(图中显示+号),将会显示 一个新的界面来添加一个新的食谱。
轻击该按钮所需的命令为:
UIATarget.localTarget().frontMostApp().navigationBar().buttons()["Add"].tap();
须要注意的是它使用了字符 Add 来标识该按钮,假设已经设置了适当的辅助标签, 如上所述。
固然,大部分复杂的手势须要须要进行完全的测试。你能够指定任何标准轻击手
势。好比,为了轻击屏幕上面任意地方,你只须要提供屏幕的坐标:
UIATarget.localTarget().tap({x:100, y:200});
该命令轻击有 x 和 y 指定的坐标,而无论屏幕上该地方是什么。
一样能够执行更复杂的轻击动做。为了双击同一个地方,你能够使用如下代码:
UIATarget.localTarget().doubleTap({x:100, y:200});
好比,执行测试两个手指捏合放大和缩小动做,你能够使用以下代码:
UIATarget.localTarget().twoFingerTap({x:100, y:200});
捏(Pinching) 捏开动做一般用于放大或扩展屏幕的对象,而相应的捏合动做一般是缩小屏幕对
象。你须要指定定义捏合开始坐标或捏开的结束坐标,而后跟着手势须要执行的时间 长度。时长参数容许你灵活指定捏动做的速度。
UIATarget.localTarget().pinchOpenFromToForDuration(({x:20, y:200}, {x:300, y:200}, 2); |
UIATarget.localTarget().pinchCloseFromToForDuration(({x:20, y:200}, {x:300, y:200}, 2); |
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [111]
Instruments User Guide
拖拽和轻弹(Dragging and Flicking) 若是你须要滚动一个列表或移动一个屏幕的元素,你能够使用
dragFromToForDuration 方法。你提供开始点的坐标和结束点的坐标,还有一个时长
(以秒为单位)。如下例子指定了一个拖到手势从点 160,200 到点 160,400,时长为 1
秒。
UIATarget.localTarget().dragFromToForDuration(({x:160, y:200}, {x:160, y:400}, 1);
轻弹手势有点相似,但它一般是一个更快的动做,因此它通常不须要时长的元素。
UIATarget.localTarget().flickFromTo(({x:160, y:200}, {x:160, y:400});
输入文字 你的脚本有可能须要测试应用处理文本输入是否正确。为此,能够经过简单的指
定一个目标文本域并使用 setValue 来设置它的文本值来输入文本到特定的文本域里 面。下面的例子使用了一个本地变量来提供一个长字符串做为当前屏幕第一个文本域 (下标为[0])的测试案例。
导航应用中标签 为了测试你应用屏幕之间的导航,你有可能须要轻击一个标签工具栏的标签。轻
击一个标签和轻击一个按钮相似;你访问合适的标签工具栏,指定所需的按钮,而后 轻击该按钮,以下面例子那样。
首先,一个本地变量被声明来表示一个工具栏。脚本使用该变量访问工具栏来确 定当前所选择的标签并获取标签的名称。最后,若是当前选中的标签的名称和想要的 标签不匹配(该例中为”Unit Conversion”),脚本轻击所需的标签。
滚动元素
滚动是许多应用用户交互的一个大部分。UI Automation 提供了一系列滚动的方
法。基础的方法容许滚动到下一个元素的左,右,上和下。大部分复杂的方法支持更
var recipeName = "Unusually Long Name for a Recipe";
UIATarget.localTarget().frontMostApp().mainWindow().textFields()[0].setValue(recipeNam
e);
var tabBar = UIATarget.localTarget().frontMostApp().mainWindow().tabBar(); |
var selectedTabName = tabBar.selectedButton().name(); |
if (selectedTabName != "Unit Conversion") { |
tabBar.buttons()["Unit Conversion"].tap(); |
} |
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [112]
Instruments User Guide
灵活的在滚动中指定动做。其中之一好比 scrollToElementWithPredicate,它容许你 滚动一个元素到你指定的区域。下面的例子经过元素层级结构访问合适的列表视图, 并滚动它到以配方名为”Turtle Pie”开始的单元格。
使用 scrollToElementWithPredicate 方法容许滚动到一个可能不知道确切名称 的元素。
使用谓词的功能能够显著的扩展你脚本的能力和适用性。关于使用谓词的更多信 息,参见 Predicate programming Guide(谓词编程指南)。
其余灵活滚动的有用方法包括 scrollToElementWithName 和 scrollToElementWithValueForKey。参见 UIAScrollView Class Reference 更多信息。
8.12.3 添加灵活的超时间
你的脚本可能须要等待某些动做完成。好比在食谱应用程序中,用户经过点击 Recipes 标签从 Unit Conversion 屏幕返回到 Recipes 屏幕。然而,UI Automation 可能检测到存在 Add 按钮,尝试使用测试脚本在按钮被真正绘画以前企图点击它,而 且应用实际上已经准备好接收该点击事件。须要执行一个精确的测试来保证 Recipes 屏幕彻底绘画完并且应用程序在屏幕控制操做以前已经准备好接收用户的交互。
为了让这些状况更灵活并且更好的控制时间,UI Automation 提供了超时周期, 在此周期内它会在失效以前重复的尝试执行指定的动做。若是动做在超时周期内完 成,该行代码返回,而且你的脚本能够处理它。若是动做未在超时以前完成,将会抛 出异常。默认的超时周期是 5 秒,可是你的脚本能够能够改变它为任什么时候间值。
为了让该特性更好用,UI Automation 使用了栈模型。你推入一个自定义超时周
期到栈顶,以下面的代码,它把超时时间缩短为 2 秒。
UIATarget.localTarget().pushTimeout(2);
你能够运行下面的代码来执行动做和把自定义超时时间推出栈。
UIATarget.localTarget().popTimeout();
使用该方法你能够建立一个强大的脚本,它能够在一个合理的时间内等于某一事 件的发生。
注意:经管一般不推荐使用显式的迟延,但在某些时候可能必须使用。如下的代码显示了如
UIATarget.localTarget().frontMostApp().mainWindow().tableViews()[0].scrollToElementWit |
hPredicate("name beginswith ‘Turtle Pie’"); |
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [113]
Instruments User Guide
何指定一个 2 秒的迟延:UIATarget.localTarget().delay(2); 8.12.4 验证测试结果
测试的关键是可以验证每一个测试已执行的,并且知道测试经过仍是失败。下面的 示例代码运行测试脚本 testName 来测试目前食谱列表上面现有的合法的食谱元素的 名称是否以“Tarte”开头。首先,使用一个本地变量来指定单元格标准:
其次,脚本使用 isValid 的方法来测试一个现有合法的元素是否匹配这些标准。
![]() ![]() ![]() var cell = UIATarget.localTarget().frontMostApp().mainWindow().tableViews()[0].cells() |
![]() ![]() .firstWithPredicate("name beginswith ‘Tarte’"); ![]() |
![]() ![]() ![]() if (cell.isValid()) { |
![]() UIALogger.logPass(testName); |
![]() } |
![]() else { |
![]() UIALogger.logFail(testName); |
![]() ![]() } ![]() |
若是发现一个合法的单元格,代码会输出一个经过的日子消息,反之,会输出一 个失败消息。
须要注意的是,该测试脚本指定 firstWithPredicate 和”name beginsWith’Tarte’”。这些准则已经适用于 Tarte aux Fraises 单元格上,它在 已经 Recipes 示例应用中出来默认数据。然而,若是一个用户给 Tarte aux Framboises 添加一条食谱,例子可能能够或不可能给出预想的结果。
8.12.5 输出测试结果和数据的日子
你的脚本报告日志信息给 Automation instrument 工具,而 instrument 工具收 集并报告给你分析结果。
当编写你测试脚本时,若是为了帮你诊断出现的任何故障的地方,你应该尽量 的输出更多的信息。最低限度是当每一个脚本开始和结束,肯定测试执行,并记录经过 和失败状态时,你应该输出日志。这种最小记录在 UI 自动化的自动完成的。你只需 要简单的使用你的测试脚本的名称来调用 logStart,运行你的测试脚本,而后合适 的时候调用 logPass 或者 logFail,以下面的代码那样。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [114]
Instruments User Guide
![]() ![]() ![]() var testName = "Module 001 Test"; |
![]() UIALogger.logStart(testName); |
![]() //some test code |
![]() ![]() UIALogger.logPass(testName); ![]() |
可是当你的脚本和控制器交互的时候,输出所发生的事情是一个很好的作法。无 论你是验证应用程序的部分是否正确执行,或在追查 Bug 信息,很难想象若是有太多 日志信息须要分析。为了不这样,你能够使用 logMessage 来输出任何发生的地方, 并且你甚至能够补充文本数据和截屏。
如下的示例代码扩展以前的输出,包括一个自由的日志输出信息和一个截屏。
var testName = "Module 001 Test"; |
UIALogger.logStart(testName); |
//some test code |
UIALogger.logMessage("Starting Module 001 branch 2, validating input."); |
//capture a screenshot with a specified name |
UIATarget.localTarget().captureScreenWithName("SS001-2_AddedIngredient"); |
//more test code |
UIALogger.logPass(testName); |
在示例代码里面的截屏将会被指定文件名为 SS001-2_AddedIngredient 保存到 Instruments 应用里面。
注意:当前在 iOS 模拟器上不支持截屏功能。然而,若是你试图使用截屏功能,简化在日志 里面输出一个失败的信息。
8.12.6处理警告
除了验证你的应用警告是否工做正常,你的测试脚本应该包含测试在应用以外出 现非预期的警告。好比,在检查天气或玩游戏的时候一般不该该出现文本信息。更糟 糕的是,一个电话销售自动拨号能够获取你的电话号码就像你启动你的脚本那样。
处理外部产生的警告 尽管看起来可能有些自相矛盾,你的应用程序和你的测试应该期待你的应用程序
运行时会发生意想不到的警报。幸运的是,UI Automation 包含了一个默认的警告处 理程序,它可让你的脚本很容易显示外部产生的警告。你的脚本提供一个名为 onAlert 的警告处理函数,它会在警告产生的时候被调用,此时它会采起相应的措施, 而后简单的返回警告给默认处理程序隐藏它。 2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [115]
Instruments User Guide
如下示例代码举例说了一个很是简单的警告例子。
该处理程序所作的事情是输出一个警告发生的类型的消息而后返回 False。返回 错误能够指导 UI Automation 的默认警告处理程序隐藏它。例如,在警告显示一个收 到的文本消息时,UI Automation 简单的单击关闭按钮。 注意:默认处理程序达到警告的上限数量时将会中止隐藏新进的警告。在不太可能发生的情 况下,你的测试达到此上限,你应该检查你的测试环境和程序找出可能出现的问题。
处理内部产生的警告 做为你应用的一部分,你有可能须要处理一些警告。在这些状况下,你的警告处
理程序可能须要执行相应的响应并返回 True 给默认处理程序,告知该警告已经被处 理。
下面的例子代码简单的扩展了基本警告处理程序。在输出该警告类型后,它测试 警告是不是预期的。若是是,它单击 Continue 按钮,并返回 Ture 来跳过默认隐藏动 做。
UIATarget.onAlert = function onAlert(alert) { |
var title = alert.name(); |
UIALogger.logWarning("Alert with title '" + title + "' encountered."); |
// return false to use the default handler |
return false; |
} |
UIATarget.onAlert = function onAlert(alert) { |
var title = alert.name(); |
UIALogger.logWarning("Alert with title '" + title + "' encountered."); |
if (title == "The Alert We Expected") { |
alert.buttons()["Continue"].tap(); |
return true; //alert handled, so bypass the default handler |
} |
// return false to use the default handle r |
return false; |
} |
该基础警告处理程序尽量简单,在容许你的脚本继续运行时,它一般能够响应 任何收到的警告。
8.12.7 检测和指定设备的方向
一个好的 iOS 应用应该在设备方向改变的时候作相应的调整,因此你的脚本应该
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [116]
Instruments User Guide
能够预知并测试这些改变。
UI Automation 工具提供了 setDeviceOrientation 方法来模拟一个设备方向的改
变。该方法使用了列表 8-1 中的常量。
注意:至于设备方向的处理,该功能彻底由软件来模拟。硬件特性好比原始加速度计数据无 法使用 UI Automation 特性并且不受它影响。
Table 8-1 Device orientation constants
Orientation constant
Description
The orientation of the device cannot be
UIA_DEVICE_ORIENTATION_UNKNOWN
determined.
The device is in portrait mode, with the device
UIA_DEVICE_ORIENTATION_PORTRAIT
upright and the home button at the bottom.
The device is in portrait mode but upside down, with the device upright and the home button at
UIA_DEVICE_ORIENTATION_PORTRAIT_UPSIDEDOWN
the top.
The device is in landscape mode, with the device upright and the home button on the right
UIA_DEVICE_ORIENTATION_LANDSCAPELEFT
side.
The device is in landscape mode, with the device upright and the home button on the left
UIA_DEVICE_ORIENTATION_LANDSCAPERIGHT
side.
The device is parallel to the ground with the
UIA_DEVICE_ORIENTATION_FACEUP
screen facing upward.
The device is parallel to the ground with the
UIA_DEVICE_ORIENTATION_FACEDOWN
screen facing downward.
与设备方向相反的是界面方向,它表明了你的应用界面在设备方向改变时所须要 的旋转。须要注意的是在横屏模式下,设备方向和界面方向是相反的,由于旋转设备 须要以相反的方向旋转内容。
UI Automation 提供了 interfaceOrientation 方法来获取当前界面方向。该方法 使用了列表 8-2 列举的常量。
Orientation constant
UIA_INTERFACE_ORIENTATION_PORTRAIT
Table 8-2 Interface orientation constants
Description
The interface is in portrait mode, with the
bottom closest to the home button.
The interface is in portrait mode but upside down, with the top closest to the home
UIA_INTERFACE_ORIENTATION_PORTRAIT_UPSIDEDOWN
button.
The interface is in landscape mode, with
UIA_INTERFACE_ORIENTATION_LANDSCAPELEFT
the left side closest to the home button.
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [117]
Instruments User Guide
UIA_INTERFACE_ORIENTATION_LANDSCAPERIGHT |
![]() ![]() ![]() The interface is in landscape mode, with ![]() the right side closest to the home button. |
下面的示例代码改变设备的方向(该例中,修改维横屏先左),而后把方向修改 为原来方向(竖屏)。
var target = UIATarget.localTarget(); |
var app = target.frontMostApp(); |
//set orientation to landscape left |
target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_LANDSCAPELEFT); |
UIALogger.logMessage("Current orientation now " + app.interfaceOrientation()); |
//reset orientation to portrait |
target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_PORTRAIT); |
UIALogger.logMessage("Current orientation now " + app.interfaceOrientation()); |
固然,一旦你修改了方向,最后你须要把方向修改回来。 当执行了一个包含改变设备方向的测试时,最好的作法是在开始测试以前设置设
备的方向,而后在测试完成的时候把方向设置回来。这样能够保证你的脚本返回到已 知状态。
你有可能已经注意到了示例代码中输出的方向信息。这些日志输出给你的测试脚 本和测试人员提供了额外的验证,确保它们不迷失方向。
8.12.8 测试多任务
当用户点击 Home 按钮退出你应用的时候,或促使其余应用进入前台时,你的应 用将会被暂停。为了模拟这种情形,UI Automation 提供了 deactivateAppForDuration 方法。你只须要调用该方法,并指定一个时长(以秒为单位),这样你的应用就能够
被暂停,以下面的代码那样。
UIATarget.localTarget().deactivateAppForDuration(10);
这样简单的一行代码能够促使你的应用被暂停 10 秒钟,和用户点击了退出按钮 并且 10 秒后返回应用的效果同样。
8.13 User Interface Instruments[用户界面相关] 如下的 instruments 工具为应用层事件收集数据。
8.13.1Cocoa事件(Cocoa Events)
Cocoa Events instrument 工具记录经过 NSApplication 类 sendEvent:方法发送
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [118]
Instruments User Guide
事件。该方法是分配事件给 Cocoa 应用的主要方法。你能够使用该 instrument 工具 来把应用程序事件和其余应用程序行为关联起来,好比内存和 CPU 占有率等。该 instrument 工具运行在当个进程之上。它的实现使用了 DTrace 技术,而且能够导入 DTrace 脚本。
该 instrument 工具捕获被发送事件的类型。
跟踪面板能够被设置来显示如下任何数据信息:
栈深度(Stack depth)
线程 ID(Thread ID)
事件种类(The Event Kind)
对于任何调用,你能够打开扩展详细面板来查看该调用的栈跟踪,和具体发生的 时间。
8.13.2Carbon事件(Carbon Events)
Carbon Events instrument 工具记录由 Carbon Event Manager 里面的函数 WaitNextEvent 返回的事件。你能够使用该 instrument 来把应用的事件和其余应用 的行为关联起来,好比内存和 CPU 占用率等。该 instrument 工具运行在单个进程之 上。它的实现使用了 DTrace 技术,并能够导入 DTrace 脚本。
该 instrument 工具捕获发送事件的类型。
跟踪面板能够被设置来显示如下数据信息:
栈深度(Stack depth)
线程 ID(Thread ID)
事件种类(The Event Kind)
对于任何调用,你能够打开扩展详细面板来查看该调用的栈跟踪,和具体发生的 时间。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [119]
Instruments User Guide
结束语
或许不少人对 Instruments 应用不太了解,但可能不少老的 iOS 开发者都应该用过 Instruments 工具来检测 iOS 应用内存泄漏状况。特别是在 iOS 5.0 以前,即苹果在 iOS 平台上面还没支持 ARC 的时候,写 iOS 应用就相似 C 语言那样,容易忘记释放内存, 而内存对移动设备而言是很是难得的。即便目前 iPhone 设备内存已经基本都知足 512MB 了,可是由于苹果的后台模式是把整个应用封装起来等待下次启用,因此该 应用所占用的内存一样被占据了。也就是即便应用进入后台模式,它仍是仍然占用原 先的内存的,因此你打开的应用越多,内存耗用天然也不少。对不少普通用户而言, 每每他们打开的应用都是进入后台模式的,不多有用户清理后台的应用,因此也就造 成不少应用其实可用内存仍是很是有限地 (题外话:若是苹果原生支持一键清理后 台程序就行了,貌似越狱的工具里面有这样的支持的)。
还有作过 iOS 应用自动化测试的开发者,应该对 UIAutomation 很熟悉吧。对, 它就是经过 JS 脚原本写界面自动化测试用例。而 Instruments 应用对 UIAutomation 支持很完善,你能够经过它查看不少代码潜在的问题,并测试性能。
其实 Instruments 应用还有不少强大的功能,它原生支持不少 instrument 工具,帮 助你分析你的代码,不只包括内存检测和自动化测试,它还能够监测文件读写操做等 等待。因此一个好的 iOS 开发者是应该掌握 Instrument 应用的使用。由于 Instruments 应用自己功能太强大的,因此彻底掌握机会不可能,可是由于它们内置的不少工具具 有类似性,因此你基本掌握本身经常使用的便可。同时了解一下内部有哪些功能,这样在 你须要用到的时候再查查文档,就能够很快上手了。
最后,本文在翻译过程当中发现不少地方直译成中文比较晦涩,因此采用了意译的 方式,这不可避免的形成有一些地方可能和原文有必定的出入,因此若是你阅读的时
候发现有任何的错误均可以给我发邮件:xyl.layne@gmail.com。 最后能够关注我微博你们一块儿沟通交流学习。
微博地址: http://weibo.com/u/1826448972
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [120]
Instruments User Guide
推荐资源
核心动画编程指南【Core Animation Programming Guide】 下载地址:
http://www.cocoachina.com/bbs/read.php?tid=84461
Blocks 编程要点【Blocks Programming Topics】 下载地址:
http://www.cocoachina.com/bbs/read.php?tid=87593
多线程编程指南【Threading Programming Guide】 下载地址:
http://www.cocoachina.com/bbs/read.php?tid=87592
本地和推送通知编程指南【Local and Push Notification Programming Guide】
下载地址:【近期推出,敬请关注微博动态】
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [121]