INSTRUMENTS調(diào)試工具的使用(三十三) —— 高級(jí)任務(wù)之創(chuàng)建自定義Instruments(二)

版本記錄

版本號(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ù)量的謂詞添加到探針中,然后使用ANDOR運(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ì)話框底部的移除按鈕( - )。

Figure 25-2 Adding or removing probes in the instrument configuration dialog

添加探針時(shí),最好為探針提供一個(gè)描述性名稱。 默認(rèn)情況下,Instruments為每個(gè)探針?lè)峙湟粋€(gè)按順序編號(hào)的名稱,例如Probe 1Probe 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)單擊謂詞的行并將其拖到表中的新位置。您可以使用ANDOR運(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è)腳本變量。

Figure 25-3 Configuring a probe’s action

當(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中的copyincopyinstr子例程。 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所示。

Figure 25-4 Returning a string pointer

重要:如果變量類型設(shè)置為string,儀器會(huì)自動(dòng)將內(nèi)置變量(如arg0arg9函數(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子例程(包括copyincopyinstr子例程)的更多信息,請(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)注~~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,514評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,373評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,975評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,743評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,199評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,414評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,951評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,780評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,218評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,649評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,889評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,673評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,967評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容