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。
最后可以關注我微博大家一起溝通交流學習。