版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2018.06.15 |
前言
我們?cè)谧鯽pp的時(shí)候,不是做完功能就結(jié)束了,很多時(shí)候是需要進(jìn)行檢查和優(yōu)化的,而xcode自帶了一個(gè)很好的檢查工具,可以檢測(cè)內(nèi)存泄漏。還可以查看哪一個(gè)方法比較耗時(shí)。還可以檢測(cè)離屏渲染等等,隨后的幾篇我們就說(shuō)一下這個(gè)工具的使用。感興趣的可以看這幾篇。
1.INSTRUMENTS調(diào)試工具的使用(一)
2.INSTRUMENTS調(diào)試工具的使用(二)
3.INSTRUMENTS調(diào)試工具的使用(三)
4.INSTRUMENTS調(diào)試工具的使用(四)
5.INSTRUMENTS調(diào)試工具的使用(五)
6.INSTRUMENTS調(diào)試工具的使用(六)
7.INSTRUMENTS調(diào)試工具的使用(七)
8.INSTRUMENTS調(diào)試工具的使用(八)
9.INSTRUMENTS調(diào)試工具的使用(九)
10. INSTRUMENTS調(diào)試工具的使用(十)
11. INSTRUMENTS調(diào)試工具的使用(十一) —— 簡(jiǎn)介(一)
12. INSTRUMENTS調(diào)試工具的使用(十二) —— 通常任務(wù)之啟動(dòng)Instruments(一)
13. INSTRUMENTS調(diào)試工具的使用(十三) —— 通常任務(wù)之簡(jiǎn)單了解Instruments(二)
14. INSTRUMENTS調(diào)試工具的使用(十四) —— 通常任務(wù)之創(chuàng)建、保存和打開跟蹤文檔(三)
15. INSTRUMENTS調(diào)試工具的使用(十五) —— 通常任務(wù)之指定目標(biāo)應(yīng)用和設(shè)備(四)
16. INSTRUMENTS調(diào)試工具的使用(十六) —— 通常任務(wù)之訪問(wèn)和使用個(gè)別儀器(五)
17. INSTRUMENTS調(diào)試工具的使用(十七) —— 通常任務(wù)之記錄、暫停和停止跟蹤(六)
18. INSTRUMENTS調(diào)試工具的使用(十八) —— 導(dǎo)航收集的數(shù)據(jù)之關(guān)于數(shù)據(jù)分析(一)
19. INSTRUMENTS調(diào)試工具的使用(十九) —— 導(dǎo)航收集的數(shù)據(jù)之導(dǎo)航時(shí)間軸窗格(二)
20. INSTRUMENTS調(diào)試工具的使用(二十) —— 導(dǎo)航收集的數(shù)據(jù)之導(dǎo)航詳細(xì)面板(三)
21. INSTRUMENTS調(diào)試工具的使用(二十一) —— 導(dǎo)航收集的數(shù)據(jù)之將數(shù)據(jù)映射到源代碼(四)
22. INSTRUMENTS調(diào)試工具的使用(二十二) —— 導(dǎo)航收集的數(shù)據(jù)之查看您應(yīng)用的源代碼(五)
23. INSTRUMENTS調(diào)試工具的使用(二十三) —— 分析你App的性能之測(cè)量CPU使用情況(一)
24. INSTRUMENTS調(diào)試工具的使用(二十四) —— 分析你App的性能之測(cè)量圖形性能(二)
25. INSTRUMENTS調(diào)試工具的使用(二十五) —— 分析你App的性能之監(jiān)視網(wǎng)絡(luò)和文件I / O(三)
26. INSTRUMENTS調(diào)試工具的使用(二十六) —— 分析你App的內(nèi)存使用之關(guān)于內(nèi)存分析(一)
27. INSTRUMENTS調(diào)試工具的使用(二十七) —— 分析你App的內(nèi)存使用之檢測(cè)內(nèi)存使用(二)
28. INSTRUMENTS調(diào)試工具的使用(二十八) —— 分析你App的內(nèi)存使用之找到廢棄的內(nèi)存(三)
29. INSTRUMENTS調(diào)試工具的使用(二十九) —— 分析你App的內(nèi)存使用之找到內(nèi)存泄露(四)
30. INSTRUMENTS調(diào)試工具的使用(三十) —— 分析你App的內(nèi)存使用之找到僵尸對(duì)象(五)
31. INSTRUMENTS調(diào)試工具的使用(三十一) —— 分析你App的能源之測(cè)量能源影響(一)
32. INSTRUMENTS調(diào)試工具的使用(三十二) —— 高級(jí)任務(wù)之導(dǎo)出和導(dǎo)入跟蹤數(shù)據(jù)(一)
Create Custom Instruments - 創(chuàng)建自定義Instruments
內(nèi)置的Instruments
提供了大量關(guān)于應(yīng)用程序內(nèi)部工作的信息。 但是,有時(shí)候,您可能希望將這些信息更貼近您自己的代碼。 例如,不是每次調(diào)用函數(shù)時(shí)收集數(shù)據(jù),您可能在收集數(shù)據(jù)時(shí)設(shè)置條件。 或者,您可能想要深入研究自己的代碼,而不是內(nèi)置instruments
允許的代碼。
重要:只要有可能,建議您使用現(xiàn)有儀器,而不是創(chuàng)建新儀器。 創(chuàng)建自定義
instruments
是一項(xiàng)高級(jí)功能。
About Custom Instruments - 關(guān)于自定義Instruments
自定義工具使用DTrace
進(jìn)行它們的行為。 DTrace
是最初由Sun創(chuàng)建并移植到OS X
的動(dòng)態(tài)跟蹤工具。由于DTrace
分入操作系統(tǒng)內(nèi)核,它允許您訪問(wèn)有關(guān)內(nèi)核本身以及計(jì)算機(jī)上運(yùn)行的用戶進(jìn)程的低級(jí)信息。許多內(nèi)置儀器已經(jīng)基于DTrace。 DTrace本身就是一個(gè)復(fù)雜的工具,但Instruments
提供了一個(gè)簡(jiǎn)單的界面,使您可以在不復(fù)雜的情況下訪問(wèn)DTrace的強(qiáng)大功能。
DTrace尚未被移植到iOS
,因此無(wú)法為運(yùn)行iOS的設(shè)備創(chuàng)建自定義instruments
。
重要:盡管定制儀器生成器簡(jiǎn)化了創(chuàng)建DTrace探測(cè)器的過(guò)程,但在創(chuàng)建新儀器之前,您仍然應(yīng)該熟悉DTrace及其工作原理。許多更強(qiáng)大的調(diào)試和數(shù)據(jù)收集操作都要求您編寫DTrace腳本。要了解DTrace和D腳本語(yǔ)言,請(qǐng)參閱Oracle Technology Network提供的
Solaris Dynamic Tracing Guide
。有關(guān)dtrace
命令行工具的信息,請(qǐng)參閱dtrace(1) Mac OS X Manual Page
。
注意:若干Apple應(yīng)用程序(即iTunes,DVD Player和使用QuickTime的應(yīng)用程序)可防止通過(guò)
DTrace
(臨時(shí)或永久)收集數(shù)據(jù),以保護(hù)敏感和受版權(quán)保護(hù)的數(shù)據(jù)。因此,在執(zhí)行全系統(tǒng)數(shù)據(jù)收集時(shí)不要運(yùn)行這些應(yīng)用程序。
自定義儀器是使用DTrace
探頭構(gòu)建的。探針就像您放在代碼中的傳感器。它對(duì)應(yīng)于DTrace可以綁定的位置或事件,例如函數(shù)入口點(diǎn)。當(dāng)函數(shù)執(zhí)行或事件生成時(shí),關(guān)聯(lián)的探測(cè)器會(huì)觸發(fā),并且DTrace將運(yùn)行與探針關(guān)聯(lián)的任何操作。大多數(shù)DTrace操作僅收集有關(guān)操作系統(tǒng)和用戶應(yīng)用程序行為的數(shù)據(jù)。但是,可以將自定義腳本作為操作的一部分運(yùn)行。使用腳本可以使用DTrace的功能來(lái)微調(diào)您收集的數(shù)據(jù)。
每遇到探頭就會(huì)觸發(fā),但與探頭相關(guān)的動(dòng)作無(wú)需在每次探頭觸發(fā)時(shí)運(yùn)行。謂詞是一個(gè)條件語(yǔ)句,允許您限制探測(cè)器的操作何時(shí)運(yùn)行。例如,您可以將探測(cè)器限制為特定的過(guò)程或用戶,或者可以在儀器中的特定條件為真時(shí)運(yùn)行操作。默認(rèn)情況下,探頭沒(méi)有任何謂詞,這意味著每次探測(cè)器觸發(fā)時(shí)都會(huì)運(yùn)行關(guān)聯(lián)的動(dòng)作。然而,您可以將任意數(shù)量的謂詞添加到探針中,然后使用AND
和OR
運(yùn)算符將它們鏈接在一起以創(chuàng)建復(fù)雜的決策樹。
自定義instrument
由以下塊組成:
- 說(shuō)明塊,包含儀器的名稱,類別和說(shuō)明
- 一個(gè)或多個(gè)探針,每個(gè)探針都包含相關(guān)的動(dòng)作和謂詞
- 數(shù)據(jù)聲明區(qū)域,用于可選地聲明由所有探針共享的全局變量
- 開始腳本,可以選擇初始化全局變量并執(zhí)行儀器所需的啟動(dòng)任務(wù)
- 結(jié)束腳本,可以選擇執(zhí)行最終的清理操作
自定義儀器必須至少具有一個(gè)與相關(guān)操作綁定的探針。同樣,自定義工具應(yīng)具有適當(dāng)?shù)拿Q和描述,以將其標(biāo)識(shí)給Instruments
用戶。儀器在庫(kù)調(diào)色板中顯示此描述性信息。提供良好的信息可以讓您更輕松地記住儀器的功能以及應(yīng)該如何使用。
探針不需要具有全局?jǐn)?shù)據(jù)聲明或開始和結(jié)束腳本。當(dāng)您想在探針之間共享數(shù)據(jù)或?yàn)閮x器提供某種初始配置時(shí),這些元素用于高級(jí)儀器設(shè)計(jì)。在 Write Custom Scripts中描述了創(chuàng)建數(shù)據(jù),開始和結(jié)束塊。
Create a Custom Instrument - 創(chuàng)建一個(gè)自定義儀器
要?jiǎng)?chuàng)建自定義DTrace儀器,請(qǐng)選擇Instrument > Build New Instrument
。 該命令顯示儀器配置對(duì)話框,如圖25-1所示。 您可以使用此表來(lái)指定您的儀器信息,包括任何探針和自定義腳本。
至少為您創(chuàng)建的每個(gè)自定義instrument
提供以下信息:
- Name - 名稱。與您的自定義instrument在庫(kù)中關(guān)聯(lián)的名稱。
-
Category - 類別。儀器出現(xiàn)在庫(kù)中的類別。您可以指定現(xiàn)有類別的名稱(例如
Memory
)或創(chuàng)建您自己的類別。 - Description - 描述。儀器說(shuō)明,用于庫(kù)調(diào)色板和儀器的工具提示中。
- Probe provider - 探針提供者。探測(cè)器類型和應(yīng)該何時(shí)觸發(fā)的細(xì)節(jié)。通常,這涉及指定探針?biāo)鶓?yīng)用的方法或功能。請(qǐng)參閱Specify the Probe Provider。
- Probe action - 探測(cè)行動(dòng)。探針觸發(fā)時(shí)要記錄的數(shù)據(jù)或要執(zhí)行的腳本,請(qǐng)參閱Add Actions to a Probe。
儀器應(yīng)至少包含一個(gè)探針,并可能包含多個(gè)探針。探針定義由提供者信息,謂詞信息和操作action
組成。所有探針都必須至少指定提供者信息,并且?guī)缀跛刑结樁级x了某種操作。探頭定義的謂詞部分是可選的,但是可以將您的儀器聚焦到正確的數(shù)據(jù)上,這是一個(gè)非常有用的工具。
1. Add and Delete Probes - 添加和刪除探針
每臺(tái)新儀器都帶有一個(gè)可配置的探頭。 要添加更多探針,請(qǐng)單擊儀器配置對(duì)話框底部的添加按鈕(+)。 見圖25-2。
要從儀器中移除探針,請(qǐng)單擊探針將其選中,然后單擊儀器配置對(duì)話框底部的移除按鈕( - )。
添加探針時(shí),最好為探針提供一個(gè)描述性名稱。 默認(rèn)情況下,Instruments為每個(gè)探針?lè)峙湟粋€(gè)按順序編號(hào)的名稱,例如Probe 1
和 Probe 2
。
2. Specify the Probe Provider - 指定探針提供者
要指定觸發(fā)探針的位置點(diǎn)或事件,請(qǐng)將相應(yīng)的提供程序與探針相關(guān)聯(lián)。 提供者是充當(dāng)DTrace代理的內(nèi)核模塊,提供創(chuàng)建探針?biāo)璧墓ぞ摺?您不需要知道提供者如何操作來(lái)創(chuàng)建工具,但您確實(shí)需要了解每個(gè)提供者的基本功能。 表25-1列出了Instrument應(yīng)用程序支持并可用于自定義儀器的提供程序。Provider
列出了儀器配置對(duì)話框中顯示的名稱,而DTrace provider
列列出了相應(yīng)DTrace腳本中使用的提供程序的實(shí)際名稱。
Table 25-1 DTrace providers
Provider | DTrace provider | Description |
---|---|---|
User Process |
pid |
探針觸發(fā)代碼中指定函數(shù)的輸入(或返回)。 您必須提供函數(shù)名稱和包含它的庫(kù)的名稱。 |
Objective-C |
objc |
探針觸發(fā)指定的Objective-C方法的入口(或返回)。 您必須提供它所屬的方法名稱和類別。 |
System Call |
syscall |
探針觸發(fā)指定系統(tǒng)庫(kù)函數(shù)的輸入(或返回) |
DTrace |
DTrace |
探測(cè)器在DTrace自身進(jìn)入Begin , End , 或者 Error 塊時(shí)觸發(fā)。 |
Kernel Function Boundaries |
fbt |
探測(cè)器觸發(fā)代碼中指定的內(nèi)核函數(shù)的入口(或返回)。 您必須提供內(nèi)核函數(shù)名稱和包含它的庫(kù)的名稱 |
Mach |
mach_trap |
探針在指定的Mach庫(kù)函數(shù)進(jìn)入(或返回)時(shí)觸發(fā) |
Profile |
profile |
探測(cè)器在機(jī)器的每個(gè)核心上按指定的時(shí)間間隔定期啟動(dòng)。 Profile探測(cè)器可以以范圍從幾微秒到幾天的粒度進(jìn)行觸發(fā) |
Tick |
tick |
探頭在機(jī)器的一個(gè)內(nèi)核上定期觸發(fā)。 Tick探測(cè)器可以以從幾微秒到幾天的粒度進(jìn)行觸發(fā)。 您可以使用此提供程序者執(zhí)行不需要位于特定內(nèi)核上的定期任務(wù) |
I/O |
io |
探針在指定的內(nèi)核例程開始時(shí)觸發(fā)。 有關(guān)此探測(cè)器監(jiān)視的功能列表,請(qǐng)使用終端上的dtrace -l 命令獲取探測(cè)點(diǎn)列表。 然后,您可以搜索此列表以查看由io 模塊監(jiān)視的探針 |
Kernel Process |
proc |
探針觸發(fā)在幾個(gè)內(nèi)核級(jí)例程之一的啟動(dòng)。 有關(guān)此探測(cè)器監(jiān)視的功能列表,請(qǐng)使用終端上的dtrace -l 命令獲取探測(cè)點(diǎn)列表。 然后您可以搜索該列表以查看proc 模塊監(jiān)視的功能 |
User-Level Synchronization |
plockstat |
探測(cè)器觸發(fā)幾個(gè)同步點(diǎn)之一。 您可以使用此提供者來(lái)監(jiān)視互斥鎖和讀寫鎖定事件 |
CPU Scheduling |
sched |
CPU調(diào)度事件發(fā)生時(shí)探針觸發(fā) |
為您的探針選擇提供者后,指定探針?biāo)璧男畔ⅰ?例如,對(duì)于某些函數(shù)級(jí)別的探測(cè)器,提供者可能需要函數(shù)或方法名稱,以及代碼模塊或包含模塊的類。 其他提供者可能只需要您從彈出式菜單中選擇適當(dāng)?shù)氖录?/p>
配置好探針后,可以向其添加其他謂詞(以確定何時(shí)應(yīng)該觸發(fā)),或者可以繼續(xù)為該探針定義操作。
3. Add Predicates to a Probe - 將謂詞添加到探針
通過(guò)Predicates
可以控制何時(shí)由儀器執(zhí)行探測(cè)器的操作。 您可以使用謂詞來(lái)防止儀器在您不需要時(shí)收集數(shù)據(jù)或認(rèn)為數(shù)據(jù)可能是錯(cuò)誤的。 例如,如果您的代碼僅在堆棧達(dá)到特定深度時(shí)才會(huì)出現(xiàn)異常行為,請(qǐng)使用謂詞來(lái)指定最小目標(biāo)堆棧深度。 每次探測(cè)器觸發(fā)時(shí),儀器都會(huì)評(píng)估相關(guān)的謂詞。 只有當(dāng)它們?cè)u(píng)估為真時(shí),DTrace
才會(huì)執(zhí)行相關(guān)的操作。
To add a predicate to a probe - 將謂詞添加到探針
- 1)點(diǎn)擊探測(cè)條件中的添加按鈕(+)。
- 2)選擇謂詞的類型。
- 3)定義謂詞值。
您可以使用探針或謂詞的添加按鈕(+)添加后續(xù)謂詞。要?jiǎng)h除謂詞,請(qǐng)單擊謂詞旁邊的刪除按鈕( - )。
儀器按照它們出現(xiàn)的順序從上到下評(píng)估謂詞。要重新排列謂詞,請(qǐng)單擊謂詞的行并將其拖到表中的新位置。您可以使用AND
和OR
運(yùn)算符鏈接謂詞,但不能將它們分組以創(chuàng)建嵌套條件塊。相反,請(qǐng)仔細(xì)排列謂詞以確保檢查適當(dāng)?shù)臈l件。
使用謂詞行中的第一個(gè)彈出菜單來(lái)選擇要檢查的數(shù)據(jù)作為條件的一部分。表25-2列出了您可以在謂詞或腳本代碼中使用的由DTrace定義的標(biāo)準(zhǔn)變量。Variable
列列出了儀器配置面板中顯示的名稱,DTrace variable
列列出了相應(yīng)DTrace腳本中使用的變量的實(shí)際名稱。除了測(cè)試標(biāo)準(zhǔn)變量外,還可以通過(guò)在謂詞字段中指定自定義變量類型來(lái)測(cè)試腳本代碼中的自定義變量和常量。
Table 25-2 DTrace variables
Variable | DTrace variable | Description |
---|---|---|
Caller |
caller |
進(jìn)入探測(cè)器之前當(dāng)前線程程序計(jì)數(shù)器的值。 這個(gè)變量包含一個(gè)整數(shù)值 |
Chip |
chip |
執(zhí)行探測(cè)的物理芯片的標(biāo)識(shí)符。 這是一個(gè)基于0的整數(shù),指示當(dāng)前內(nèi)核的索引。 例如,一個(gè)四核機(jī)器的核心從0到3 |
CPU |
cpu |
執(zhí)行探測(cè)的CPU的標(biāo)識(shí)符。 這是一個(gè)基于0的整數(shù),指示當(dāng)前內(nèi)核的索引。 例如,一個(gè)四核機(jī)器的核心從0到3 |
Current Working Directory |
cwd |
當(dāng)前進(jìn)程的當(dāng)前工作目錄。 該變量包含一個(gè)字符串值 |
Last Error # |
errno |
最近一次系統(tǒng)調(diào)用在當(dāng)前線程上返回的錯(cuò)誤值。 這個(gè)變量包含一個(gè)整數(shù)值 |
Executable |
execname |
傳遞給exec 以執(zhí)行當(dāng)前進(jìn)程的名稱。 該變量包含一個(gè)字符串值 |
User ID |
uid |
當(dāng)前進(jìn)程的user ID,改變量包含一個(gè)整數(shù)值 |
Group ID |
gid |
當(dāng)前進(jìn)程的group ID,改變量包含一個(gè)整數(shù)值 |
Process ID |
pid |
當(dāng)前進(jìn)程的process ID,改變量包含一個(gè)整數(shù)值 |
Parent ID |
ppid |
父進(jìn)程的process ID,改變量包含一個(gè)整數(shù)值 |
Interrupt Priority Level |
ipl |
探針觸發(fā)時(shí)當(dāng)前CPU的中斷優(yōu)先級(jí)。 該變量包含一個(gè)無(wú)符號(hào)的整數(shù)值 |
Function |
probefunc |
探針描述的函數(shù)名稱部分。 該變量包含一個(gè)字符串值 |
Module |
probemod |
探針描述的模塊名稱部分。 該變量包含一個(gè)字符串值 |
Name |
probename |
探針描述的名稱部分。 該變量包含一個(gè)字符串值 |
Provider |
probeprov |
探針描述的提供者名稱部分。 該變量包含一個(gè)字符串值 |
Root Directory |
root |
進(jìn)程的根目錄,該變量包含一個(gè)字符串值 |
Stack Depth |
stackdepth |
當(dāng)前線程在線程啟動(dòng)時(shí)的堆棧幀深度。 該變量包含一個(gè)無(wú)符號(hào)的整數(shù)值。 |
User Stack Depth |
ustackdepth |
線程觸發(fā)時(shí)當(dāng)前線程的用戶幀(忽略內(nèi)核模式幀)的堆棧幀深度。 該變量包含一個(gè)無(wú)符號(hào)的整數(shù)值 |
Relative Timestamp |
timestamp |
系統(tǒng)時(shí)間戳計(jì)數(shù)器的當(dāng)前值,以納秒為單位。 由于此計(jì)數(shù)器從過(guò)去的任意點(diǎn)遞增,因此僅使用它計(jì)算相對(duì)時(shí)間差。 該變量包含一個(gè)無(wú)符號(hào)的64位整數(shù)值 |
Virtual Timestamp |
vtimestamp |
當(dāng)前線程運(yùn)行的時(shí)間量,以納秒為單位。 此值不包括在DTrace 謂詞和操作中花費(fèi)的時(shí)間。 該變量包含一個(gè)無(wú)符號(hào)的64位整數(shù)值 |
Timestamp |
walltimestamp/1000 |
自00:00通用時(shí)間(1970年1月1日)以來(lái)經(jīng)過(guò)的當(dāng)前納秒數(shù)。此變量包含一個(gè)無(wú)符號(hào)的64位整數(shù)值 |
arg0 through arg9 |
arg0 through arg9 |
探針的前10個(gè)參數(shù),以原始64位整數(shù)表示。 如果向探針傳遞的參數(shù)少于十個(gè),則其余變量包含值0。 |
Custom |
The name of your variable |
使用此選項(xiàng)可以從一個(gè)腳本中指定變量或常量。 |
除了指定要檢查的變量外,還必須指定一個(gè)比較運(yùn)算符(等于,不等于,etc)以及用于與變量進(jìn)行比較的值。
4. Add Actions to a Probe - 將操作添加到探針
當(dāng)您的儀器定義的探測(cè)點(diǎn)被擊中并且探測(cè)的謂詞條件評(píng)估為真時(shí),DTrace
將運(yùn)行與探測(cè)相關(guān)的操作。您可以使用探針的操作來(lái)收集數(shù)據(jù)或執(zhí)行其他處理。例如,如果您的探針監(jiān)視特定的函數(shù)或方法,則可以讓該函數(shù)的調(diào)用方和任何堆棧跟蹤信息返回到Instruments
。如果您想要稍微更高級(jí)的操作,可以使用腳本變量來(lái)跟蹤調(diào)用該函數(shù)的次數(shù)并報(bào)告該信息。如果您想要更高級(jí)的操作,可以編寫一個(gè)使用內(nèi)核級(jí)DTrace函數(shù)的腳本來(lái)確定函數(shù)使用的鎖的狀態(tài)。在后一種情況下,您的腳本代碼也可能會(huì)返回鎖的當(dāng)前所有者(如果有的話),以幫助您確定代碼的不同線程之間的交互。
圖25-3顯示了儀器配置對(duì)話框的指定探頭操作的部分。腳本部分僅包含一個(gè)文本字段,供您輸入腳本代碼。 (在將代碼傳遞給DTrace
之前,儀器不會(huì)驗(yàn)證您的代碼,因此請(qǐng)仔細(xì)檢查您的代碼。)底部部分包含用于指定要DTrace
返回到儀器的數(shù)據(jù)的控件。您可以使用彈出菜單來(lái)配置要返回的內(nèi)置DTrace
變量。當(dāng)?shù)谝粋€(gè)彈出菜單設(shè)置為Record
時(shí),可以選擇從第二個(gè)彈出式菜單中選擇Custom
并返回其中一個(gè)腳本變量。
當(dāng)您將儀器配置為返回自定義變量時(shí),Instruments會(huì)要求您提供以下信息:
- 包含數(shù)據(jù)的腳本變量
- 應(yīng)用于儀器界面中的變量的名稱
- 變量的類型
您的探針?lè)祷氐絻x器的任何數(shù)據(jù)都會(huì)收集并顯示在儀器的詳細(xì)信息窗格中。詳細(xì)信息窗格顯示所有數(shù)據(jù)變量,而不管類型。如果堆棧跟蹤信息可用于特定探針,儀器會(huì)在儀器的檢查器窗格的擴(kuò)展詳細(xì)信息區(qū)域中顯示該信息。另外,Instruments會(huì)自動(dòng)查找儀器返回的整數(shù)數(shù)據(jù)類型,并將這些類型添加到儀器可以在跟蹤窗格中顯示的統(tǒng)計(jì)數(shù)據(jù)列表中。
因?yàn)?code>DTrace腳本在內(nèi)核空間中運(yùn)行,并且Instruments應(yīng)用程序在用戶空間中運(yùn)行,所以如果要將基于自定義指針的腳本變量的值返回給Instruments,則必須創(chuàng)建一個(gè)緩沖區(qū)來(lái)保存變量的數(shù)據(jù)。創(chuàng)建緩沖區(qū)的最簡(jiǎn)單方法是使用DTrace
中的copyin
或copyinstr
子例程。 copyinstr
子例程接受一個(gè)指向C字符串的指針,并以可返回到Instruments的形式返回該字符串的內(nèi)容。同樣,copyin
子例程接受一個(gè)指針和size值,并向數(shù)據(jù)返回一個(gè)緩沖區(qū),稍后您可以使用stringof關(guān)鍵字將其格式化為一個(gè)字符串。這兩個(gè)子例程都是DTrace環(huán)境的一部分,可以從探測(cè)器操作定義的任何部分使用。例如,要從C風(fēng)格的字符串指針?lè)祷刈址恍枋褂?code>copyinstr子例程封裝變量名稱,如圖25-4所示。
重要:如果變量類型設(shè)置為
string
,儀器會(huì)自動(dòng)將內(nèi)置變量(如arg0
至arg9
函數(shù)參數(shù))與調(diào)用copyinstr
包裝在一起。 但是,Instruments不會(huì)自動(dòng)包裝腳本的自定義變量。 您有責(zé)任確保自定義變量中的數(shù)據(jù)實(shí)際上與為該變量指定的類型匹配。
有關(guān)儀器支持的內(nèi)置變量列表,請(qǐng)參閱Table 25-2。 有關(guān)腳本和腳本變量的更多信息,請(qǐng)參閱Write Custom Scripts。 有關(guān)DTrace子例程(包括copyin
和copyinstr
子例程)的更多信息,請(qǐng)參閱 Oracle Technology Network提供的Solaris Dynamic Tracing Guide
。
Write Custom Scripts - 寫自定義腳本
您使用D腳本語(yǔ)言編寫DTrace腳本,其語(yǔ)法源自C編程語(yǔ)言的大部分子集。 D語(yǔ)言將C語(yǔ)言的編程結(jié)構(gòu)與一組特殊的函數(shù)和變量相結(jié)合,以幫助您跟蹤應(yīng)用程序中的信息。
以下各節(jié)介紹在自定義instruments
中使用腳本的常用方法。這些部分不提供D語(yǔ)言的全面概述或編寫DTrace腳本的過(guò)程。有關(guān)腳本和D語(yǔ)言的信息,請(qǐng)參閱Oracle Technology Network提供的Solaris Dynamic Tracing Guide
。
1. Write Begin and End Scripts - 編寫開始和結(jié)束腳本
如果您想要做的不僅僅是當(dāng)您的操作觸發(fā)時(shí)將DTrace內(nèi)置變量中的信息返回給Instruments,則需要編寫自定義腳本。腳本在內(nèi)核級(jí)與DTrace
直接交互,提供對(duì)內(nèi)核和活動(dòng)進(jìn)程的低級(jí)信息的訪問(wèn)。大多數(shù)儀器使用腳本來(lái)收集DTrace中不容易獲得的信息。在將其返回給Instruments之前,您還可以使用腳本來(lái)處理原始數(shù)據(jù)。例如,如果您想讓圖形化的值與Instruments軌道窗格中的其他值進(jìn)行比較,可以使用腳本將數(shù)據(jù)值標(biāo)準(zhǔn)化到特定的范圍。
在儀器中,自定義儀器配置對(duì)話框提供了幾個(gè)可編寫DTrace腳本的區(qū)域:
- 數(shù)據(jù)部分包含您想要在儀器中使用的任何全局變量的定義。
- 開始部分包含儀器的任何初始化代碼。
- 每個(gè)探針都包含腳本代碼作為其操作的一部分。
- 結(jié)束部分包含儀器的清理代碼。
所有腳本部分都是可選的。如果你的儀器不需要它們,你不需要有初始化腳本或清理腳本。但是,如果您的儀器在其Data
部分中定義了全局變量,則建議您還提供初始化腳本以將這些變量設(shè)置為已知值。 D語(yǔ)言不允許您為您的全局變量聲明內(nèi)聯(lián)賦值,因此您必須將這些賦值放在Begin
部分。例如,簡(jiǎn)單的數(shù)據(jù)部分可能由單個(gè)變量聲明組成,如下所示:
int myVariable;
然后相應(yīng)的Begin
部分將包含以下代碼以初始化該變量:
myVariable = 0;
如果相應(yīng)的探針操作更改myVariable
的值,則可以使用探針的End
部分來(lái)格式化并打印出變量的最終值。
大多數(shù)腳本代碼可能與單個(gè)探針相關(guān)聯(lián)。每個(gè)探測(cè)器可以有一個(gè)與其動(dòng)作相關(guān)的腳本。當(dāng)需要執(zhí)行探測(cè)動(dòng)作時(shí),DTrace首先運(yùn)行您的腳本代碼,然后將所有請(qǐng)求的數(shù)據(jù)返回給Instruments。由于將數(shù)據(jù)傳回儀器涉及將數(shù)據(jù)從內(nèi)核空間復(fù)制回儀器應(yīng)用程序空間,因此應(yīng)始終通過(guò)在儀器配置對(duì)話框的Record the following data
部分中配置適當(dāng)?shù)臈l目將數(shù)據(jù)傳回儀器。從腳本代碼手動(dòng)返回的變量可能無(wú)法正確返回到Instruments
。
2. Access Kernel Data from Custom Scripts - 從自定義腳本訪問(wèn)內(nèi)核數(shù)據(jù)
因?yàn)镈Trace腳本在系統(tǒng)內(nèi)核中執(zhí)行,所以他們可以訪問(wèn)內(nèi)核符號(hào)。要在您的DTrace腳本中查看自定義工具中的全局內(nèi)核變量和數(shù)據(jù)結(jié)構(gòu),請(qǐng)?jiān)谧兞康拿Q前加反引號(hào)字符(`)。反引號(hào)字符告訴DTrace在當(dāng)前腳本之外尋找指定的變量。
Listing 25-1
顯示了一個(gè)示例動(dòng)作腳本,它從avenrun
內(nèi)核變量中檢索當(dāng)前負(fù)載信息,并使用該變量計(jì)算系統(tǒng)的一分鐘平均負(fù)載。如果使用Profile提供者創(chuàng)建探針,則可以讓此腳本定期收集加載數(shù)據(jù),然后在Instruments中繪制該信息。
Listing 25-1Accessing 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;
3. Scope Variables Appropriately - 合理更改變量范圍
由于缺少流量控制語(yǔ)句和希望將探測(cè)執(zhí)行時(shí)間降至最低,DTrace
腳本具有基本平坦的結(jié)構(gòu)。 也就是說(shuō),您可以根據(jù)需要將DTrace腳本中的變量范圍擴(kuò)展到不同的級(jí)別。 表25-3列出了變量的范圍級(jí)別以及在每個(gè)級(jí)別使用變量的語(yǔ)法。
Table 25-3 Variable scope in DTrace scripts
Scope | Syntax example | Description |
---|---|---|
Global |
myGlobal = 1; |
全局變量由變量名稱標(biāo)識(shí)。 所有系統(tǒng)線程上的所有探測(cè)動(dòng)作都可以訪問(wèn)此空間中的變量。 |
Thread |
self->myThreadVar = 1; |
線程局部變量從self 關(guān)鍵字中取消引用。 在同一個(gè)線程上運(yùn)行的所有探測(cè)器操作都可以訪問(wèn)此空間中的變量。 您可以使用此作用域在當(dāng)前線程的多次探測(cè)操作過(guò)程中收集數(shù)據(jù)。 |
Probe |
this->myLocalVar = 1; |
探針局部變量使用this 關(guān)鍵字取消引用。 只有當(dāng)前運(yùn)行的探針才能訪問(wèn)此空間中的變量。 通常,使用此作用域來(lái)定義在當(dāng)前操作結(jié)束時(shí)希望內(nèi)核清理的臨時(shí)變量。 |
4. Find Script Errors - 找到腳本錯(cuò)誤
如果其中一個(gè)自定義instruments
的腳本代碼包含錯(cuò)誤,則當(dāng)DTrace
編譯腳本時(shí),instruments
會(huì)在軌道窗格中顯示錯(cuò)誤消息。 儀器在跟蹤文檔中單擊Record
按鈕后,但在跟蹤實(shí)際開始之前報(bào)告錯(cuò)誤。 錯(cuò)誤消息內(nèi)部是一個(gè)編輯按鈕。 點(diǎn)擊此按鈕可打開儀器配置對(duì)話框,該對(duì)話框現(xiàn)在可識(shí)別帶有錯(cuò)誤的探針。
Export and Import DTrace Scripts - 導(dǎo)出和導(dǎo)入DTrace腳本
雖然儀器為收集跟蹤數(shù)據(jù)提供了一個(gè)方便的界面,但有時(shí)使用DTrace
直接收集跟蹤數(shù)據(jù)更為方便。例如,如果您是系統(tǒng)管理員或正在編寫自動(dòng)化測(cè)試腳本,則您可能更愿意使用DTrace
命令行界面啟動(dòng)進(jìn)程并收集數(shù)據(jù)。使用命令行工具需要您編寫自己的DTrace腳本,這可能會(huì)耗費(fèi)時(shí)間并可能導(dǎo)致錯(cuò)誤。如果你已經(jīng)有一個(gè)或多個(gè)基于DTrace的instruments
文件,你可以使用instruments
產(chǎn)生DTrace腳本,這與您的跟蹤文檔中的儀器一樣,都是相同的行為。
儀器支持僅為所有儀器基于DTrace的文檔導(dǎo)出DTrace腳本。這意味著您的文檔可以包含自定義instruments和一些內(nèi)置instruments,例如庫(kù)調(diào)色板中的文件系統(tǒng)相關(guān)和Core Data instruments。
To export a DTrace script - 導(dǎo)出DTrace腳本
- 1)選擇跟蹤文檔。
- 2)選擇
File > DTrace Script Export
。 - 3)輸入DTrace腳本的名稱。
- 4)為DTrace腳本選擇一個(gè)位置。
- 5)點(diǎn)擊保存。
DTrace Script Export
命令將儀器的腳本命令放置在文本文件中,然后可以使用-s
選項(xiàng)將其傳遞到dtrace
命令行工具。例如,如果您導(dǎo)出名為MyInstrumentsScript.d
的腳本,請(qǐng)使用以下命令從終端運(yùn)行它:
sudo dtrace -s MyInstrumentsScript.d
注意:在大多數(shù)情況下,您必須擁有超級(jí)用戶權(quán)限才能運(yùn)行
dtrace
,這就是在前面的示例中使用sudo
命令運(yùn)行dtrace
的原因。
從Instruments導(dǎo)出腳本的另一個(gè)優(yōu)點(diǎn)(與手動(dòng)編寫腳本相反)是,在運(yùn)行腳本之后,可以將結(jié)果數(shù)據(jù)導(dǎo)入到Instruments中并在其中查看。 從Instruments導(dǎo)出的腳本在DTrace輸出的開頭打印一個(gè)開始標(biāo)記(帶有文本dtrace_output_begin
)。 要收集數(shù)據(jù),只需從終端復(fù)制所有DTrace輸出(包括開始標(biāo)記)并將其粘貼到文本文件中,或者直接將輸出從dtrace
工具直接重定向到文件。 要在儀器中導(dǎo)入數(shù)據(jù),請(qǐng)選擇您生成原始腳本的跟蹤文檔,然后選擇File > DTrace Data
導(dǎo)入。
后記
本篇主要講述了創(chuàng)建自定義Instruments,感興趣的給個(gè)贊或者關(guān)注~~~~