Instrument詳解

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
第一章
Ins
truments快速入門
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
Blank
Mac OS X, iOS, iOS Simulator, User
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 built-in instruments, see 「Built-in Instruments.」
Activity Monitor
Mac OS X, iOS, iOS 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.
Allocations
Mac OS X, iOS, iOS Simulator
Adds the Allocations and VM Tracker instruments to your document. Use this template to monitor memory and object-allocation patterns in your program. (To use this template, you must launch your process from Instruments.)
Automation
iOS, iOS Simulator
Adds the Automation instrument to your document. Use this template to automate user interface tests of your iOS application.
Core Animation
iOS
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 understand how content is rendered on the screen.
Core Data
Mac OS X
Adds the Core Data Fetches, Core Data Cache Misses, and Core Data Saves instruments to your document. Use this template to monitor data store interactions in a Core Data application.
CPU Sampler
Mac OS X, iOS, iOS Simulator
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 being done specifically by your application.
Dispatch
Mac OS X
Adds the Dispatch instrument to your document. Use this template if you want to capture information about GCD queues created by your application and about the block objects executing on these queues.
Energy Diagnostics
iOS
Adds the Energy Diagnostics, CPU Activity, Display Brightness, Sleep/Wake, Bluetooth, WiFi, and GPS instruments to your document. Use this template to get diagnostic information regarding energy usage in iOS devices.
File Activity
Mac OS X, iOS Simulator
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 the file system itself, including permission and owner changes.
GC Monitor
Mac OS X
Adds the ObjectGraph, Allocations, and Garbage Collection instruments to your document. Use this template to measure the data reclaimed in the scavenge phase of the garbage collector.
Leaks
Mac OS X, iOS, iOS Simulator
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 Instruments.)
Multicore
Mac OS X
Adds the Thread States and Dispatch instruments to your document. Use this template to analyze multicore performance, including thread state, dispatch queues, and block usage.
OpenGL ES Analysis
iOS
Adds the OpenGL ES Analyzer and OpenGL ES Driver instruments to your document. Use this template to measure OpenGL ES activity and get 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
Mac OS X, iOS Simulator
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
Mac OS X, iOS Simulator
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
Instruments pane
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.」
Track pane
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 detail in 「The Track Pane.」
Detail 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, see 「The Detail Pane.」
Extended 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 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
Pause/Resume button
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. 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
Inspection Range control
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 information, see 「Viewing Data for a Range of Time.」
Time/Run control
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 Runs.」
View control
Hides or shows the Instruments pane, Detail pane, and Extended Detail pane. This control makes it easier to focus on the area of interest.
Library button
Hides or shows the instrument library. For information on using the Library window, see 「Using the Instrument Librar
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 應用不能在運行以前執行這些步驟。
1. 啓
動Instruments。應用會自動新建一個跟蹤文檔,並提示你選擇一個模板。
2. 選
擇Activity Monitor模板,而後單擊選擇按鈕。Instruments會把Activity Monitor instruments工具添加到跟蹤文檔裏面。
3. 在
跟蹤文檔的默認目標菜單裏面,選擇All Process。
4. 點
擊Record按鈕。
5. 等
待幾秒以便Instruments來收集一些數據。
6. 點
擊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
1. 選
擇一個分組。
2. 在
分組裏面選擇一個你想要刪除的instrument。
3. 選
擇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.
Used Within
Matches instruments based on when they were used. You can use this criterion to match only instruments that were used within the last few minutes, hours, days, or weeks.
Search Criteria Matches
Matches instruments whose title, description, category, or keywords include the specified 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
Environment Variable
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 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.
Options
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 specify whether the application is launched in 32-bit or 64-bit mode.
View All
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 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工具設置基礎的跟蹤目標,你能夠作如下這些:
1. 在
Target menu裏面,選擇Instrument Specific的選項。
2. 選
擇你的instruments工具裏面的其中一個。
3. 單
擊i圖標來打開instrument工具的檢查器。
4. 在
檢查器的窗口,使用目標區域的彈出菜單來給instrument工具設置目標,如圖3-3所示。
Figure 3-3 Choosing per-instrument trace targets
5. 重
復第2步到第4步來給每一個instrument工具設置目標。
3.2
收集數據
在你已經選擇了一個要跟蹤的進程以後,你就能夠開始收集數據了。你能夠使用兩個不一樣的記錄模式之一來收集數據:
􀁺
Immediate display(當即顯示)。在測量的期間,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)。你應該避免使用已經被其餘應用程序使用的組合鍵。
爲了使用快速啓動鍵來給應用程序收集數據,你要作如下步驟:
1. 把
光標放在屬於你要跟蹤的應用程序的窗口上面。
2. 按
下合適的組合鍵來開始跟蹤。
3. 運行應用程序。
4. 當
你想中止跟蹤的時候,你有兩種選擇:
􀁺
把光標放在其中之一的應用程序窗口上面,再次按下組合鍵。
􀁺
找到已經打開的跟蹤文檔並按下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應用和你設備本身的無線鏈接:
1. 把
你的設備經過USB線鏈接到你的電腦。
2. 在
Xcode裏面,把你的應用程序載入你的設備。
3. 在
Instruments裏面,打開或新建一個跟蹤文檔。
4. 按
下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退出或鎖定你的設備以後,它依然起做用。在網絡鏈接條件如以前提到的同樣,你能夠繼續使用無線鏈接。
爲了中斷無線鏈接:
1. 在
Instruments應用裏面,打開一個跟蹤文檔。
2. 按
下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 Documentation
Opens the Xcode Documentation window and brings up documentation, if available, 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
Sample Perspective
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.)
Call Tree
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 ways that make it easier to spot trends.
Call Tree Constraints
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 a branch.
Active Thread
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 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描述了每一個模式的顯示信息和你如何使用這些模式來發現問題。
Table 5-3 Analyzing data in the Detail pane
Mode
Description
Table
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 the history of events that occurred at the same memory address.
Outline
Use this mode to see the call trees associated with allocated objects. Clicking the follow link button next to an object type focuses on the call trees associated solely with that object type.
Diagram
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 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 Lifespan
Choose between displaying all allocation events and those associated with objects that still 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.
Call Tree Constraints
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 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 Configuration
Use the available option to enable automatic leak detection and to gather the contents 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
Core Data Saves
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 memory overhead and lead to paging.
Core Data Fetches
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 gaps to prefetch data that you know will be needed later.
Core Data Faulting
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 to which it is related.
Core Data Cache Misses
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 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),包括探針的類別和它什麼時候觸發的詳細信息。一般包含了探針應用的指定方法或函數。關於更多信息,參閱「指定探針提供者」。
􀁺
探針動做(Probe action),當你探針觸發時須要記錄的數據或者須要執行的腳本。參閱「添加動做到探針」部分。
一個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
User Process
pid
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 contains it.
Objective-C
objc
The probe fires on entry (or return) of the specified Objective-C method. You must provide the method name and the class to which it belongs.
System Call
syscall
The probe fires on entry (or return) of the specified system library function.
DTrace
DTrace
The probe fires when DTrace itself enters a BEGIN, END, or ERROR block.
Kernel Function Boundaries
fbt
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.
Profile
profile
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 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
Caller
caller
The value of the current thread’s program counter just before entering the probe. This variable contains an integer value.
Chip
chip
The identifier for the physical chip executing the probe. This is a 0-based integer indicating the index of the current core. For example, a four core machine has cores 0 through 3.
CPU
cpu
The identifier for the CPU executing the probe. This is a 0-based integer indicating the index of the current core. For example, a four core machine has cores 0 through 3.
Current Working Directory
cwd
The current working directory of the current process. This variable contains a string value.
Last Error #
errno
The error value returned by the last system call made on the current thread. This variable contains an integer value.
Executable
execname
The name that was passed to exec to execute the current process. This variable contains a string value.
User ID
uid
The real user ID of the current process. This variable contains an integer value.
Group ID
gid
The real group ID of the current process. This variable contains an integer value.
Process ID
pid
The process ID of the current process. This variable contains an integer value.
Parent ID
ppid
The process ID of the parent process. This variable contains an integer value.
Thread ID
tid
The thread ID of the current thread. This is the same value 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
The interrupt priority level on the current CPU at the time the probe fired. This variable contains an unsigned integer value.
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
The stack frame depth of the current thread at the time the thread fired. This variable contains an unsigned integer value.
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部分可能簡單的由一個變量聲明構成,以下:
int myVariable;
相應的BEGIN部分可能包含如下對變量初始化的代碼:
myVariable = 0;
若是你相應的探針動做改變了myVariable的值,你可能須要在你探針的END部分格式化並打印出變量的最終值。
你的大部分腳本均可能和單獨的探針相關聯。每一個探針包含一個和它動做相關的腳本。當是時候執行探針動做的時候,DTrace首先會運行你的代碼,而後返回任何要求的數據給Instruments應用。由於傳遞數據回Instruments應用包括從內核空間拷貝數據到Instruments應用的程序空間,所以你應該老是經過在「Record the following data:」部分的instruments配置表裏面配置合適的實體來傳遞數據返回給Instruments應用。在你的腳本代碼裏面人工返回的變量有可能沒法正確的返回給Instruments應用。
7.2.7
從自定義腳本里面訪問內核數據
由於DTrace腳本在系統的內核執行,它們能夠訪問內核的字符。若是你想要在自定義instruments工具裏面查看內核全局變量和數據結構,你能夠在你的DTrace腳本里面執行這些操做。爲了訪問內核變量,你必須在變量名稱前面加一個反引符(~)。反引號字符告知DTrace查找當前腳本以外的指定變量。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved.                     [66]
Instruments User Guide
列表7-1顯示了一個動做腳本樣本,它從內核變量avenrun檢索當前加載信息,使用這些變量來計算系統平均加載的平均事件。若是你打算使用Profile provider來建立一個探針,你能夠使用這個腳原本週期性的收集加載數據,而後在Instruments應用裏面圖示化該信息。
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;
7.2.8
變量做用域
DTrace腳本有一個基本扁平的結構,由於缺少流程控制語句,並且其設計爲了保證探針的執行時間最小化。然而DTrace腳本里面的變量,根據你的需求劃分到不一樣的做用域。表7-3列出了這些變量的做用域級別,和在每一個級別使用這些變量的語法。
Table 7-3 Variable scope in DTrace scripts
Scope
Syntax example
Description
Global
myGlobal = 1;
Global variables are identified simply using the variable name. All probe actions on all system threads have access to variables in this space.
Thread
self‐>myThreadVar = 1;
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 runs of a probe’s action on the current thread.
Probe
this‐>myLocalVar = 1;
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 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的腳本,你可能要在終端運行如下命令:
sudo dtrace -s MyInstrumentsScript.d
注意:大部分狀況下你必須使用超級用戶的權限來運行dtrace,這是爲何sudo命令會在上面的例子中被放在dtrace的前面。
爲你的Instruments應用導出你腳本文件(相對應手動編寫)的另外一個優點是在你運行腳本後,你能夠導入結果數據到Instruments應用裏面,並評審它。從Instruments應用導出的腳本會打印一個開始標誌(<dtrace_output_begin>)在dtrace輸出文件的開頭。爲爲了收集數據,簡單的拷貝全部DTrace在終端輸出的信息,並把它粘貼到文本文件裏面,或者簡單的在dtrace命令後面重定向輸出到一個文件裏面。爲了導入Instruments應用的數據,選中生成原始腳本的跟蹤文檔,並選擇File > DTrace Data Import。
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved.                     [68]
Instruments User Guide
第八章
內置i
nstruments工具
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]
Instruments User Guide
詳細面板的樣本數據
該instruments工具捕獲如下信息:
􀁺
Caller(調用者) 觸發高速緩存未命中的方法名(包括棧跟蹤信息)。
􀁺
Cache Miss(高速緩存未命中) 引起高速緩存未命中的對象的名稱。
􀁺
CM duration(高速緩存未命中的耗時) 故障處理例程執行所用時長(以微爲單位)。
􀁺
RCM source(相關高速緩存未命中源) 高速緩存未命中的相關源。
􀁺
RCM Relationship(相關高速緩存未命中關係) 關係名稱。
􀁺
RCM duration (相關高速緩存未命中耗時) 相關高速緩存未命中的耗時(以微秒爲單位)。
跟蹤面板的顯式項
能夠設置跟蹤面板來顯式如下任何的數據:
􀁺
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(圖形)若是該選項被選中,Dispatch instrument工具會在跟蹤面板上面顯示該隊列的直方圖統計信息。
􀁺
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待在隊列的平均時間(以微秒爲單位)。換而言之,調用時間和進入隊列時間之間的差別。
􀁺
Total CPU Time(總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的全部調用的中的執行時間(以微秒爲單位)。
􀁺
Average Work Time(平均工做時間)該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工具的典型工做流程:
1. 連
接設備到你的開發環境。
2. 啓
動Xcode或Instruments應用。
3. 在
設備上面,選擇Settings > Developers,並打開電源日誌(power logging)。
4. 斷
開設備,並執行所需的測試。
5. 重
新鏈接設備。
6. 在
Instruments應用裏面打開Energy Diagnostics模板。
7. 選
擇 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]
Instruments User Guide
􀁺
回收的字節(Bytes reclaimed)
􀁺
正在使用的字節(Bytes in use)
􀁺
所有字節(Total bytes)
對於詳細面板的條目,你能夠在擴展詳細面板打開該調用的棧跟蹤信息,和任何可用探針的信息、事件發生的時間。
8.5.2
垃圾回收(Garbage Collection)
Garbage Collection instrument工具測量垃圾回收器清除階段的回收數據。該instrument工具能夠運行在當個進程或全部當前系統運行的進程之上。該instrument工具的實現使用了DTrace,並能夠導入一個DTrace腳本。它只記錄啓動了垃圾回收的進程的數據。
該instrument工具捕獲如下信息:
􀁺
對象的初始化和回收函數(包括棧跟蹤信息)
􀁺
分配內存的區(zone)
􀁺
事件是不是分代的(1爲YES,0爲NO)
􀁺
由垃圾回收器回收的對象的數量
􀁺
由垃圾回收器回收的字節的數量
􀁺
清除時間的持續時間(以微秒爲單位)
跟蹤面板能夠被設置來顯示如下信息:
􀁺
棧深度(Stack depth)
􀁺
線程ID(Thread ID)
􀁺
區(Zone)
􀁺
是否分代(Is generational)(分代回收器查找由非分代回收器錯過的不在使用的比較舊的對象,但它須要運行更長的時間,因此不常常運行)
􀁺
回收的對象(Objects reclaimed)
􀁺
回收的字節(Bytes reclaimed)
􀁺
持續時間(Duration)
對於詳細面板的條目,你能夠在擴展詳細面板打開該調用的棧跟蹤信息,和任何可用探針的信息、事件發生的時間。
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)的覆蓋層在覈心動畫複印的圖像上面。
􀁺
當即着色(Color Immediately),執行着色刷新操做以後,不須要等待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工具捕獲如下信息:
􀁺
上下文計數(Context Count)全局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花在頂點處理和平鋪的時間比例。
􀁺
設備利用率%(Device Utilization %)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命令的序列。
􀁺
跟蹤功能(Function trace)OpenGL命令的所有列表,和擴展詳細視圖的參數和回溯跟蹤。
􀁺
API統計(API statistics)列出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工具備點相似,可是它們之間也有不少的不一樣:
􀁺
Time Profil以詐騙(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.8
CPU監控器(CPU Monitor)
CPU Monitor instrument工具記錄系統的負載。該instrument工具能夠運行在單個進程或系統全部當前運行的進程之上。
跟蹤面板能夠被設置來默認顯示如下負載值,但你也能夠配置它來顯示其餘類型的數據。默認狀況下,它顯示如下信息:
􀁺
系統產生的負載的數量
􀁺
用戶產生的負載的數量
􀁺
系統總負載
8.10.9
活動監控器(Activity Monitor)
Activity Monitor instrument記錄由虛擬內存大小測量的系統負載。該instrument工具能夠運行在單個進程或系統全部當前運行的進程之上。
跟蹤面板能夠被設置來默認顯示如下的負載值,你也能夠配置它來顯示其餘類型的數據。默認狀況下,它顯示如下信息:
􀁺
正在使用的虛擬內存控件的總量
􀁺
系統產生的負載數量
􀁺
用戶產生的負載數量
􀁺
系統總負載
8.11
Threads/Locks Instruments[線程相關]
如下instruments收集線程相關的數據。
8.11.1
Java線程(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工具備細微的不一樣。如下是執行的步驟:
1. 啓
動Instrument應用。
2. 選
擇Automation模板來建立一個跟蹤文檔。(可選的,你能夠在Instrument應用的工具庫裏的UI Automation組找到Automation instrument工具,並拖動它到跟蹤文檔裏面)。
3. 確
保詳細視圖被顯示。(若是有必要選擇View > Detail)
4. 在
Target菜單裏面選擇目標iOS設備,而後從iOS應用程序裏面列表選擇你的應用程序。
測試iOS模擬器裏面的應用
當選擇目標應用程序運行在iOS模擬器之上時,你可能須要經過導航欄裏面的Choose Target文件瀏覽器選擇目標應用程序,使用如下的本地路徑
~/Library/Application Support/iOS Simulator/<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工具,執行如下步驟:
1. 如
果有必要單擊腳本的擴展三角形,顯示面板主體內容。
2. 單
擊Choose Script。
3. 在
打開的面板裏面,找到腳本文件並打開它。
4. 單
擊Instruments工具欄的Record按鈕。腳本日誌條目將會出如今詳細面板裏面。
5. 單
擊擴展面板裏面的任何腳本日誌條目來在擴展詳細面板裏面顯示該條目的更多信息。
6. 使
用中止(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();
爲了得到應用窗口,和你應用的主窗口,你應該指定
UIATarget.localTarget().frontMostApp().mainWIndow();
開始時,食譜應用程序窗口如圖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,你能夠使用下面的代碼來訪問它的名稱:
UIATarget.localTarget().frontMostApp().mainWindow().tableViews()[0].cells()[0].elements(「Chocolate Cake」);
顯示元素的層級結構
你能夠使用logElementTree方法來顯示每一個元素的全部子元素集。如下的代碼舉例說明列出食譜應用的主界面的元素。
// 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])的測試案例。
var recipeName = "Unusually Long Name for a Recipe";
UIATarget.localTarget().frontMostApp().mainWindow().textFields()[0].setValue(recipeName);
導航應用中標籤
爲了測試你應用屏幕之間的導航,你有可能須要輕擊一個標籤工具欄的標籤。輕擊一個標籤和輕擊一個按鈕相似;你訪問合適的標籤工具欄,指定所需的按鈕,而後輕擊該按鈕,以下面例子那樣。
var tabBar = UIATarget.localTarget().frontMostApp().mainWindow().tabBar();
var selectedTabName = tabBar.selectedButton().name();
if (selectedTabName != "Unit Conversion") {
tabBar.buttons()["Unit Conversion"].tap();
}
首先,一個本地變量被聲明來表示一個工具欄。腳本使用該變量訪問工具欄來肯定當前所選擇的標籤並獲取標籤的名稱。最後,若是當前選中的標籤的名稱和想要的標籤不匹配(該例中爲」Unit Conversion」),腳本輕擊所需的標籤。
滾動元素
滾動是許多應用用戶交互的一個大部分。UI Automation提供了一系列滾動的方法。基礎的方法容許滾動到下一個元素的左,右,上和下。大部分複雜的方法支持更
2011-12-07 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved.                     [112]
Instruments User Guide
靈活的在滾動中指定動做。其中之一好比scrollToElementWithPredicate,它容許你滾動一個元素到你指定的區域。下面的例子經過元素層級結構訪問合適的列表視圖,並滾動它到以配方名爲」Turtle Pie」開始的單元格。
UIATarget.localTarget().frontMostApp().mainWindow().tableViews()[0].scrollToElementWithPredicate("name beginswith ‘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();
使用該方法你能夠建立一個強大的腳本,它能夠在一個合理的時間內等於某一事件的發生。
注意:經管一般不推薦使用顯式的遲延,但在某些時候可能必須使用。如下的代碼顯示瞭如
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」開頭。首先,使用一個本地變量來指定單元格標準:
var cell = UIATarget.localTarget().frontMostApp().mainWindow().tableViews()[0].cells()
.firstWithPredicate("name beginswith ‘Tarte’");
其次,腳本使用isValid的方法來測試一個現有合法的元素是否匹配這些標準。
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
如下示例代碼舉例說了一個很是簡單的警告例子。
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; }
該處理程序所作的事情是輸出一個警告發生的類型的消息而後返回False。返回錯誤能夠指導UI Automation的默認警告處理程序隱藏它。例如,在警告顯示一個收到的文本消息時,UI Automation簡單的單擊關閉按鈕。
注意:默認處理程序達到警告的上限數量時將會中止隱藏新進的警告。在不太可能發生的狀況下,你的測試達到此上限,你應該檢查你的測試環境和程序找出可能出現的問題。
處理內部產生的警告
做爲你應用的一部分,你有可能須要處理一些警告。在這些狀況下,你的警告處理程序可能須要執行相應的響應並返回True給默認處理程序,告知該警告已經被處理。
下面的例子代碼簡單的擴展了基本警告處理程序。在輸出該警告類型後,它測試警告是不是預期的。若是是,它單擊Continue按鈕,並返回Ture來跳過默認隱藏動做。
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
UIA_DEVICE_ORIENTATION_UNKNOWN
The orientation of the device cannot be determined.
UIA_DEVICE_ORIENTATION_PORTRAIT
The device is in portrait mode, with the device upright and the home button at the bottom.
UIA_DEVICE_ORIENTATION_PORTRAIT_UPSIDEDOWN
The device is in portrait mode but upside down, with the device upright and the home button at the top.
UIA_DEVICE_ORIENTATION_LANDSCAPELEFT
The device is in landscape mode, with the device upright and the home button on the right side.
UIA_DEVICE_ORIENTATION_LANDSCAPERIGHT
The device is in landscape mode, with the device upright and the home button on the left side.
UIA_DEVICE_ORIENTATION_FACEUP
The device is parallel to the ground with the screen facing upward.
UIA_DEVICE_ORIENTATION_FACEDOWN
The device is parallel to the ground with the screen facing downward.
與設備方向相反的是界面方向,它表明了你的應用界面在設備方向改變時所須要的旋轉。須要注意的是在橫屏模式下,設備方向和界面方向是相反的,由於旋轉設備須要以相反的方向旋轉內容。
UI Automation提供了interfaceOrientation方法來獲取當前界面方向。該方法使用了列表8-2列舉的常量。
Table 8-2 Interface orientation constants
Orientation constant
Description
UIA_INTERFACE_ORIENTATION_PORTRAIT
The interface is in portrait mode, with the bottom closest to the home button.
UIA_INTERFACE_ORIENTATION_PORTRAIT_UPSIDEDOWN
The interface is in portrait mode but upside down, with the top closest to the home button.
UIA_INTERFACE_ORIENTATION_LANDSCAPELEFT
The interface is in landscape mode, with 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.1
Cocoa事件(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.2
Carbon事件(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。
最後能夠關注我微博你們一塊兒溝通交流學習。web

相關文章
相關標籤/搜索