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

版本記錄

版本號 時間
V1.0 2018.06.15

前言

我們在做app的時候,不是做完功能就結(jié)束了,很多時候是需要進(jìn)行檢查和優(yōu)化的,而xcode自帶了一個很好的檢查工具,可以檢測內(nèi)存泄漏。還可以查看哪一個方法比較耗時。還可以檢測離屏渲染等等,隨后的幾篇我們就說一下這個工具的使用。感興趣的可以看這幾篇。
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)試工具的使用(十一) —— 簡介(一)
12. INSTRUMENTS調(diào)試工具的使用(十二) —— 通常任務(wù)之啟動Instruments(一)
13. INSTRUMENTS調(diào)試工具的使用(十三) —— 通常任務(wù)之簡單了解Instruments(二)
14. INSTRUMENTS調(diào)試工具的使用(十四) —— 通常任務(wù)之創(chuàng)建、保存和打開跟蹤文檔(三)
15. INSTRUMENTS調(diào)試工具的使用(十五) —— 通常任務(wù)之指定目標(biāo)應(yīng)用和設(shè)備(四)
16. INSTRUMENTS調(diào)試工具的使用(十六) —— 通常任務(wù)之訪問和使用個別儀器(五)
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)航時間軸窗格(二)
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的性能之測量CPU使用情況(一)
24. INSTRUMENTS調(diào)試工具的使用(二十四) —— 分析你App的性能之測量圖形性能(二)
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)存使用之檢測內(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)存使用之找到僵尸對象(五)
31. INSTRUMENTS調(diào)試工具的使用(三十一) —— 分析你App的能源之測量能源影響(一)
32. INSTRUMENTS調(diào)試工具的使用(三十二) —— 高級任務(wù)之導(dǎo)出和導(dǎo)入跟蹤數(shù)據(jù)(一)

Create Custom Instruments - 創(chuàng)建自定義Instruments

內(nèi)置的Instruments提供了大量關(guān)于應(yīng)用程序內(nèi)部工作的信息。 但是,有時候,您可能希望將這些信息更貼近您自己的代碼。 例如,不是每次調(diào)用函數(shù)時收集數(shù)據(jù),您可能在收集數(shù)據(jù)時設(shè)置條件。 或者,您可能想要深入研究自己的代碼,而不是內(nèi)置instruments允許的代碼。

重要:只要有可能,建議您使用現(xiàn)有儀器,而不是創(chuàng)建新儀器。 創(chuàng)建自定義instruments是一項(xiàng)高級功能。


About Custom Instruments - 關(guān)于自定義Instruments

自定義工具使用DTrace進(jìn)行它們的行為。 DTrace是最初由Sun創(chuàng)建并移植到OS X的動態(tài)跟蹤工具。由于DTrace分入操作系統(tǒng)內(nèi)核,它允許您訪問有關(guān)內(nèi)核本身以及計算機(jī)上運(yùn)行的用戶進(jìn)程的低級信息。許多內(nèi)置儀器已經(jīng)基于DTrace。 DTrace本身就是一個復(fù)雜的工具,但Instruments提供了一個簡單的界面,使您可以在不復(fù)雜的情況下訪問DTrace的強(qiáng)大功能。

DTrace尚未被移植到iOS,因此無法為運(yùn)行iOS的設(shè)備創(chuàng)建自定義instruments。

重要:盡管定制儀器生成器簡化了創(chuàng)建DTrace探測器的過程,但在創(chuàng)建新儀器之前,您仍然應(yīng)該熟悉DTrace及其工作原理。許多更強(qiáng)大的調(diào)試和數(shù)據(jù)收集操作都要求您編寫DTrace腳本。要了解DTrace和D腳本語言,請參閱Oracle Technology Network提供的Solaris Dynamic Tracing Guide。有關(guān)dtrace命令行工具的信息,請參閱dtrace(1) Mac OS X Manual Page

注意:若干Apple應(yīng)用程序(即iTunes,DVD Player和使用QuickTime的應(yīng)用程序)可防止通過DTrace(臨時或永久)收集數(shù)據(jù),以保護(hù)敏感和受版權(quán)保護(hù)的數(shù)據(jù)。因此,在執(zhí)行全系統(tǒng)數(shù)據(jù)收集時不要運(yùn)行這些應(yīng)用程序。

自定義儀器是使用DTrace探頭構(gòu)建的。探針就像您放在代碼中的傳感器。它對應(yīng)于DTrace可以綁定的位置或事件,例如函數(shù)入口點(diǎn)。當(dāng)函數(shù)執(zhí)行或事件生成時,關(guān)聯(lián)的探測器會觸發(fā),并且DTrace將運(yùn)行與探針關(guān)聯(lián)的任何操作。大多數(shù)DTrace操作僅收集有關(guān)操作系統(tǒng)和用戶應(yīng)用程序行為的數(shù)據(jù)。但是,可以將自定義腳本作為操作的一部分運(yùn)行。使用腳本可以使用DTrace的功能來微調(diào)您收集的數(shù)據(jù)。

每遇到探頭就會觸發(fā),但與探頭相關(guān)的動作無需在每次探頭觸發(fā)時運(yùn)行。謂詞是一個條件語句,允許您限制探測器的操作何時運(yùn)行。例如,您可以將探測器限制為特定的過程或用戶,或者可以在儀器中的特定條件為真時運(yùn)行操作。默認(rèn)情況下,探頭沒有任何謂詞,這意味著每次探測器觸發(fā)時都會運(yùn)行關(guān)聯(lián)的動作。然而,您可以將任意數(shù)量的謂詞添加到探針中,然后使用ANDOR運(yùn)算符將它們鏈接在一起以創(chuàng)建復(fù)雜的決策樹。

自定義instrument由以下塊組成:

  • 說明塊,包含儀器的名稱,類別和說明
  • 一個或多個探針,每個探針都包含相關(guān)的動作和謂詞
  • 數(shù)據(jù)聲明區(qū)域,用于可選地聲明由所有探針共享的全局變量
  • 開始腳本,可以選擇初始化全局變量并執(zhí)行儀器所需的啟動任務(wù)
  • 結(jié)束腳本,可以選擇執(zhí)行最終的清理操作

自定義儀器必須至少具有一個與相關(guān)操作綁定的探針。同樣,自定義工具應(yīng)具有適當(dāng)?shù)拿Q和描述,以將其標(biāo)識給Instruments用戶。儀器在庫調(diào)色板中顯示此描述性信息。提供良好的信息可以讓您更輕松地記住儀器的功能以及應(yīng)該如何使用。

探針不需要具有全局?jǐn)?shù)據(jù)聲明或開始和結(jié)束腳本。當(dāng)您想在探針之間共享數(shù)據(jù)或?yàn)閮x器提供某種初始配置時,這些元素用于高級儀器設(shè)計。在 Write Custom Scripts中描述了創(chuàng)建數(shù)據(jù),開始和結(jié)束塊。


Create a Custom Instrument - 創(chuàng)建一個自定義儀器

要創(chuàng)建自定義DTrace儀器,請選擇Instrument > Build New Instrument。 該命令顯示儀器配置對話框,如圖25-1所示。 您可以使用此表來指定您的儀器信息,包括任何探針和自定義腳本。

至少為您創(chuàng)建的每個自定義instrument提供以下信息:

  • Name - 名稱。與您的自定義instrument在庫中關(guān)聯(lián)的名稱。
  • Category - 類別。儀器出現(xiàn)在庫中的類別。您可以指定現(xiàn)有類別的名稱(例如Memory)或創(chuàng)建您自己的類別。
  • Description - 描述。儀器說明,用于庫調(diào)色板和儀器的工具提示中。
  • Probe provider - 探針提供者。探測器類型和應(yīng)該何時觸發(fā)的細(xì)節(jié)。通常,這涉及指定探針?biāo)鶓?yīng)用的方法或功能。請參閱Specify the Probe Provider
  • Probe action - 探測行動。探針觸發(fā)時要記錄的數(shù)據(jù)或要執(zhí)行的腳本,請參閱Add Actions to a Probe

儀器應(yīng)至少包含一個探針,并可能包含多個探針。探針定義由提供者信息,謂詞信息和操作action組成。所有探針都必須至少指定提供者信息,并且?guī)缀跛刑结樁级x了某種操作。探頭定義的謂詞部分是可選的,但是可以將您的儀器聚焦到正確的數(shù)據(jù)上,這是一個非常有用的工具。

1. Add and Delete Probes - 添加和刪除探針

每臺新儀器都帶有一個可配置的探頭。 要添加更多探針,請單擊儀器配置對話框底部的添加按鈕(+)。 見圖25-2。

要從儀器中移除探針,請單擊探針將其選中,然后單擊儀器配置對話框底部的移除按鈕( - )。

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

添加探針時,最好為探針提供一個描述性名稱。 默認(rèn)情況下,Instruments為每個探針分配一個按順序編號的名稱,例如Probe 1Probe 2。

2. Specify the Probe Provider - 指定探針提供者

要指定觸發(fā)探針的位置點(diǎn)或事件,請將相應(yīng)的提供程序與探針相關(guān)聯(lián)。 提供者是充當(dāng)DTrace代理的內(nèi)核模塊,提供創(chuàng)建探針?biāo)璧墓ぞ摺?您不需要知道提供者如何操作來創(chuàng)建工具,但您確實(shí)需要了解每個提供者的基本功能。 表25-1列出了Instrument應(yīng)用程序支持并可用于自定義儀器的提供程序。Provider列出了儀器配置對話框中顯示的名稱,而DTrace provider列列出了相應(yīng)DTrace腳本中使用的提供程序的實(shí)際名稱。

Table 25-1 DTrace providers

Provider DTrace provider Description
User Process pid 探針觸發(fā)代碼中指定函數(shù)的輸入(或返回)。 您必須提供函數(shù)名稱和包含它的庫的名稱。
Objective-C objc 探針觸發(fā)指定的Objective-C方法的入口(或返回)。 您必須提供它所屬的方法名稱和類別。
System Call syscall 探針觸發(fā)指定系統(tǒng)庫函數(shù)的輸入(或返回)
DTrace DTrace 探測器在DTrace自身進(jìn)入Begin, End, 或者 Error塊時觸發(fā)。
Kernel Function Boundaries fbt 探測器觸發(fā)代碼中指定的內(nèi)核函數(shù)的入口(或返回)。 您必須提供內(nèi)核函數(shù)名稱和包含它的庫的名稱
Mach mach_trap 探針在指定的Mach庫函數(shù)進(jìn)入(或返回)時觸發(fā)
Profile profile 探測器在機(jī)器的每個核心上按指定的時間間隔定期啟動。 Profile探測器可以以范圍從幾微秒到幾天的粒度進(jìn)行觸發(fā)
Tick tick 探頭在機(jī)器的一個內(nèi)核上定期觸發(fā)。 Tick探測器可以以從幾微秒到幾天的粒度進(jìn)行觸發(fā)。 您可以使用此提供程序者執(zhí)行不需要位于特定內(nèi)核上的定期任務(wù)
I/O io 探針在指定的內(nèi)核例程開始時觸發(fā)。 有關(guān)此探測器監(jiān)視的功能列表,請使用終端上的dtrace -l命令獲取探測點(diǎn)列表。 然后,您可以搜索此列表以查看由io模塊監(jiān)視的探針
Kernel Process proc 探針觸發(fā)在幾個內(nèi)核級例程之一的啟動。 有關(guān)此探測器監(jiān)視的功能列表,請使用終端上的dtrace -l命令獲取探測點(diǎn)列表。 然后您可以搜索該列表以查看proc模塊監(jiān)視的功能
User-Level Synchronization plockstat 探測器觸發(fā)幾個同步點(diǎn)之一。 您可以使用此提供者來監(jiān)視互斥鎖和讀寫鎖定事件
CPU Scheduling sched CPU調(diào)度事件發(fā)生時探針觸發(fā)

為您的探針選擇提供者后,指定探針?biāo)璧男畔ⅰ?例如,對于某些函數(shù)級別的探測器,提供者可能需要函數(shù)或方法名稱,以及代碼模塊或包含模塊的類。 其他提供者可能只需要您從彈出式菜單中選擇適當(dāng)?shù)氖录?/p>

配置好探針后,可以向其添加其他謂詞(以確定何時應(yīng)該觸發(fā)),或者可以繼續(xù)為該探針定義操作。

3. Add Predicates to a Probe - 將謂詞添加到探針

通過Predicates可以控制何時由儀器執(zhí)行探測器的操作。 您可以使用謂詞來防止儀器在您不需要時收集數(shù)據(jù)或認(rèn)為數(shù)據(jù)可能是錯誤的。 例如,如果您的代碼僅在堆棧達(dá)到特定深度時才會出現(xiàn)異常行為,請使用謂詞來指定最小目標(biāo)堆棧深度。 每次探測器觸發(fā)時,儀器都會評估相關(guān)的謂詞。 只有當(dāng)它們評估為真時,DTrace才會執(zhí)行相關(guān)的操作。

To add a predicate to a probe - 將謂詞添加到探針

  • 1)點(diǎn)擊探測條件中的添加按鈕(+)。
  • 2)選擇謂詞的類型。
  • 3)定義謂詞值。

您可以使用探針或謂詞的添加按鈕(+)添加后續(xù)謂詞。要刪除謂詞,請單擊謂詞旁邊的刪除按鈕( - )。

儀器按照它們出現(xiàn)的順序從上到下評估謂詞。要重新排列謂詞,請單擊謂詞的行并將其拖到表中的新位置。您可以使用ANDOR運(yùn)算符鏈接謂詞,但不能將它們分組以創(chuàng)建嵌套條件塊。相反,請仔細(xì)排列謂詞以確保檢查適當(dāng)?shù)臈l件。

使用謂詞行中的第一個彈出菜單來選擇要檢查的數(shù)據(jù)作為條件的一部分。表25-2列出了您可以在謂詞或腳本代碼中使用的由DTrace定義的標(biāo)準(zhǔn)變量。Variable列列出了儀器配置面板中顯示的名稱,DTrace variable列列出了相應(yīng)DTrace腳本中使用的變量的實(shí)際名稱。除了測試標(biāo)準(zhǔn)變量外,還可以通過在謂詞字段中指定自定義變量類型來測試腳本代碼中的自定義變量和常量。

Table 25-2 DTrace variables

Variable DTrace variable Description
Caller caller 進(jìn)入探測器之前當(dāng)前線程程序計數(shù)器的值。 這個變量包含一個整數(shù)值
Chip chip 執(zhí)行探測的物理芯片的標(biāo)識符。 這是一個基于0的整數(shù),指示當(dāng)前內(nèi)核的索引。 例如,一個四核機(jī)器的核心從0到3
CPU cpu 執(zhí)行探測的CPU的標(biāo)識符。 這是一個基于0的整數(shù),指示當(dāng)前內(nèi)核的索引。 例如,一個四核機(jī)器的核心從0到3
Current Working Directory cwd 當(dāng)前進(jìn)程的當(dāng)前工作目錄。 該變量包含一個字符串值
Last Error # errno 最近一次系統(tǒng)調(diào)用在當(dāng)前線程上返回的錯誤值。 這個變量包含一個整數(shù)值
Executable execname 傳遞給exec以執(zhí)行當(dāng)前進(jìn)程的名稱。 該變量包含一個字符串值
User ID uid 當(dāng)前進(jìn)程的user ID,改變量包含一個整數(shù)值
Group ID gid 當(dāng)前進(jìn)程的group ID,改變量包含一個整數(shù)值
Process ID pid 當(dāng)前進(jìn)程的process ID,改變量包含一個整數(shù)值
Parent ID ppid 父進(jìn)程的process ID,改變量包含一個整數(shù)值
Interrupt Priority Level ipl 探針觸發(fā)時當(dāng)前CPU的中斷優(yōu)先級。 該變量包含一個無符號的整數(shù)值
Function probefunc 探針描述的函數(shù)名稱部分。 該變量包含一個字符串值
Module probemod 探針描述的模塊名稱部分。 該變量包含一個字符串值
Name probename 探針描述的名稱部分。 該變量包含一個字符串值
Provider probeprov 探針描述的提供者名稱部分。 該變量包含一個字符串值
Root Directory root 進(jìn)程的根目錄,該變量包含一個字符串值
Stack Depth stackdepth 當(dāng)前線程在線程啟動時的堆棧幀深度。 該變量包含一個無符號的整數(shù)值。
User Stack Depth ustackdepth 線程觸發(fā)時當(dāng)前線程的用戶幀(忽略內(nèi)核模式幀)的堆棧幀深度。 該變量包含一個無符號的整數(shù)值
Relative Timestamp timestamp 系統(tǒng)時間戳計數(shù)器的當(dāng)前值,以納秒為單位。 由于此計數(shù)器從過去的任意點(diǎn)遞增,因此僅使用它計算相對時間差。 該變量包含一個無符號的64位整數(shù)值
Virtual Timestamp vtimestamp 當(dāng)前線程運(yùn)行的時間量,以納秒為單位。 此值不包括在DTrace謂詞和操作中花費(fèi)的時間。 該變量包含一個無符號的64位整數(shù)值
Timestamp walltimestamp/1000 自00:00通用時間(1970年1月1日)以來經(jīng)過的當(dāng)前納秒數(shù)。此變量包含一個無符號的64位整數(shù)值
arg0 through arg9 arg0 through arg9 探針的前10個參數(shù),以原始64位整數(shù)表示。 如果向探針傳遞的參數(shù)少于十個,則其余變量包含值0。
Custom The name of your variable 使用此選項(xiàng)可以從一個腳本中指定變量或常量。

除了指定要檢查的變量外,還必須指定一個比較運(yùn)算符(等于,不等于,etc)以及用于與變量進(jìn)行比較的值。

4. Add Actions to a Probe - 將操作添加到探針

當(dāng)您的儀器定義的探測點(diǎn)被擊中并且探測的謂詞條件評估為真時,DTrace將運(yùn)行與探測相關(guān)的操作。您可以使用探針的操作來收集數(shù)據(jù)或執(zhí)行其他處理。例如,如果您的探針監(jiān)視特定的函數(shù)或方法,則可以讓該函數(shù)的調(diào)用方和任何堆棧跟蹤信息返回到Instruments。如果您想要稍微更高級的操作,可以使用腳本變量來跟蹤調(diào)用該函數(shù)的次數(shù)并報告該信息。如果您想要更高級的操作,可以編寫一個使用內(nèi)核級DTrace函數(shù)的腳本來確定函數(shù)使用的鎖的狀態(tài)。在后一種情況下,您的腳本代碼也可能會返回鎖的當(dāng)前所有者(如果有的話),以幫助您確定代碼的不同線程之間的交互。

圖25-3顯示了儀器配置對話框的指定探頭操作的部分。腳本部分僅包含一個文本字段,供您輸入腳本代碼。 (在將代碼傳遞給DTrace之前,儀器不會驗(yàn)證您的代碼,因此請仔細(xì)檢查您的代碼。)底部部分包含用于指定要DTrace返回到儀器的數(shù)據(jù)的控件。您可以使用彈出菜單來配置要返回的內(nèi)置DTrace變量。當(dāng)?shù)谝粋€彈出菜單設(shè)置為Record時,可以選擇從第二個彈出式菜單中選擇Custom并返回其中一個腳本變量。

Figure 25-3 Configuring a probe’s action

當(dāng)您將儀器配置為返回自定義變量時,Instruments會要求您提供以下信息:

  • 包含數(shù)據(jù)的腳本變量
  • 應(yīng)用于儀器界面中的變量的名稱
  • 變量的類型

您的探針返回到儀器的任何數(shù)據(jù)都會收集并顯示在儀器的詳細(xì)信息窗格中。詳細(xì)信息窗格顯示所有數(shù)據(jù)變量,而不管類型。如果堆棧跟蹤信息可用于特定探針,儀器會在儀器的檢查器窗格的擴(kuò)展詳細(xì)信息區(qū)域中顯示該信息。另外,Instruments會自動查找儀器返回的整數(shù)數(shù)據(jù)類型,并將這些類型添加到儀器可以在跟蹤窗格中顯示的統(tǒng)計數(shù)據(jù)列表中。

因?yàn)?code>DTrace腳本在內(nèi)核空間中運(yùn)行,并且Instruments應(yīng)用程序在用戶空間中運(yùn)行,所以如果要將基于自定義指針的腳本變量的值返回給Instruments,則必須創(chuàng)建一個緩沖區(qū)來保存變量的數(shù)據(jù)。創(chuàng)建緩沖區(qū)的最簡單方法是使用DTrace中的copyincopyinstr子例程。 copyinstr子例程接受一個指向C字符串的指針,并以可返回到Instruments的形式返回該字符串的內(nèi)容。同樣,copyin子例程接受一個指針和size值,并向數(shù)據(jù)返回一個緩沖區(qū),稍后您可以使用stringof關(guān)鍵字將其格式化為一個字符串。這兩個子例程都是DTrace環(huán)境的一部分,可以從探測器操作定義的任何部分使用。例如,要從C風(fēng)格的字符串指針返回字符串,只需使用copyinstr子例程封裝變量名稱,如圖25-4所示。

Figure 25-4 Returning a string pointer

重要:如果變量類型設(shè)置為string,儀器會自動將內(nèi)置變量(如arg0arg9函數(shù)參數(shù))與調(diào)用copyinstr包裝在一起。 但是,Instruments不會自動包裝腳本的自定義變量。 您有責(zé)任確保自定義變量中的數(shù)據(jù)實(shí)際上與為該變量指定的類型匹配。

有關(guān)儀器支持的內(nèi)置變量列表,請參閱Table 25-2。 有關(guān)腳本和腳本變量的更多信息,請參閱Write Custom Scripts。 有關(guān)DTrace子例程(包括copyincopyinstr子例程)的更多信息,請參閱 Oracle Technology Network提供的Solaris Dynamic Tracing Guide。


Write Custom Scripts - 寫自定義腳本

您使用D腳本語言編寫DTrace腳本,其語法源自C編程語言的大部分子集。 D語言將C語言的編程結(jié)構(gòu)與一組特殊的函數(shù)和變量相結(jié)合,以幫助您跟蹤應(yīng)用程序中的信息。

以下各節(jié)介紹在自定義instruments中使用腳本的常用方法。這些部分不提供D語言的全面概述或編寫DTrace腳本的過程。有關(guān)腳本和D語言的信息,請參閱Oracle Technology Network提供的Solaris Dynamic Tracing Guide

1. Write Begin and End Scripts - 編寫開始和結(jié)束腳本

如果您想要做的不僅僅是當(dāng)您的操作觸發(fā)時將DTrace內(nèi)置變量中的信息返回給Instruments,則需要編寫自定義腳本。腳本在內(nèi)核級與DTrace直接交互,提供對內(nèi)核和活動進(jìn)程的低級信息的訪問。大多數(shù)儀器使用腳本來收集DTrace中不容易獲得的信息。在將其返回給Instruments之前,您還可以使用腳本來處理原始數(shù)據(jù)。例如,如果您想讓圖形化的值與Instruments軌道窗格中的其他值進(jìn)行比較,可以使用腳本將數(shù)據(jù)值標(biāo)準(zhǔn)化到特定的范圍。

在儀器中,自定義儀器配置對話框提供了幾個可編寫DTrace腳本的區(qū)域:

  • 數(shù)據(jù)部分包含您想要在儀器中使用的任何全局變量的定義。
  • 開始部分包含儀器的任何初始化代碼。
  • 每個探針都包含腳本代碼作為其操作的一部分。
  • 結(jié)束部分包含儀器的清理代碼。

所有腳本部分都是可選的。如果你的儀器不需要它們,你不需要有初始化腳本或清理腳本。但是,如果您的儀器在其Data部分中定義了全局變量,則建議您還提供初始化腳本以將這些變量設(shè)置為已知值。 D語言不允許您為您的全局變量聲明內(nèi)聯(lián)賦值,因此您必須將這些賦值放在Begin部分。例如,簡單的數(shù)據(jù)部分可能由單個變量聲明組成,如下所示:

int myVariable;

然后相應(yīng)的Begin部分將包含以下代碼以初始化該變量:

myVariable = 0;

如果相應(yīng)的探針操作更改myVariable的值,則可以使用探針的End部分來格式化并打印出變量的最終值。

大多數(shù)腳本代碼可能與單個探針相關(guān)聯(lián)。每個探測器可以有一個與其動作相關(guān)的腳本。當(dāng)需要執(zhí)行探測動作時,DTrace首先運(yùn)行您的腳本代碼,然后將所有請求的數(shù)據(jù)返回給Instruments。由于將數(shù)據(jù)傳回儀器涉及將數(shù)據(jù)從內(nèi)核空間復(fù)制回儀器應(yīng)用程序空間,因此應(yīng)始終通過在儀器配置對話框的Record the following data部分中配置適當(dāng)?shù)臈l目將數(shù)據(jù)傳回儀器。從腳本代碼手動返回的變量可能無法正確返回到Instruments。

2. Access Kernel Data from Custom Scripts - 從自定義腳本訪問內(nèi)核數(shù)據(jù)

因?yàn)镈Trace腳本在系統(tǒng)內(nèi)核中執(zhí)行,所以他們可以訪問內(nèi)核符號。要在您的DTrace腳本中查看自定義工具中的全局內(nèi)核變量和數(shù)據(jù)結(jié)構(gòu),請?jiān)谧兞康拿Q前加反引號字符(`)。反引號字符告訴DTrace在當(dāng)前腳本之外尋找指定的變量。

Listing 25-1顯示了一個示例動作腳本,它從avenrun內(nèi)核變量中檢索當(dāng)前負(fù)載信息,并使用該變量計算系統(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 - 合理更改變量范圍

由于缺少流量控制語句和希望將探測執(zhí)行時間降至最低,DTrace腳本具有基本平坦的結(jié)構(gòu)。 也就是說,您可以根據(jù)需要將DTrace腳本中的變量范圍擴(kuò)展到不同的級別。 表25-3列出了變量的范圍級別以及在每個級別使用變量的語法。

Table 25-3 Variable scope in DTrace scripts

Scope Syntax example Description
Global myGlobal = 1; 全局變量由變量名稱標(biāo)識。 所有系統(tǒng)線程上的所有探測動作都可以訪問此空間中的變量。
Thread self->myThreadVar = 1; 線程局部變量從self關(guān)鍵字中取消引用。 在同一個線程上運(yùn)行的所有探測器操作都可以訪問此空間中的變量。 您可以使用此作用域在當(dāng)前線程的多次探測操作過程中收集數(shù)據(jù)。
Probe this->myLocalVar = 1; 探針局部變量使用this關(guān)鍵字取消引用。 只有當(dāng)前運(yùn)行的探針才能訪問此空間中的變量。 通常,使用此作用域來定義在當(dāng)前操作結(jié)束時希望內(nèi)核清理的臨時變量。

4. Find Script Errors - 找到腳本錯誤

如果其中一個自定義instruments的腳本代碼包含錯誤,則當(dāng)DTrace編譯腳本時,instruments會在軌道窗格中顯示錯誤消息。 儀器在跟蹤文檔中單擊Record按鈕后,但在跟蹤實(shí)際開始之前報告錯誤。 錯誤消息內(nèi)部是一個編輯按鈕。 點(diǎn)擊此按鈕可打開儀器配置對話框,該對話框現(xiàn)在可識別帶有錯誤的探針。


Export and Import DTrace Scripts - 導(dǎo)出和導(dǎo)入DTrace腳本

雖然儀器為收集跟蹤數(shù)據(jù)提供了一個方便的界面,但有時使用DTrace直接收集跟蹤數(shù)據(jù)更為方便。例如,如果您是系統(tǒng)管理員或正在編寫自動化測試腳本,則您可能更愿意使用DTrace命令行界面啟動進(jìn)程并收集數(shù)據(jù)。使用命令行工具需要您編寫自己的DTrace腳本,這可能會耗費(fèi)時間并可能導(dǎo)致錯誤。如果你已經(jīng)有一個或多個基于DTrace的instruments文件,你可以使用instruments產(chǎn)生DTrace腳本,這與您的跟蹤文檔中的儀器一樣,都是相同的行為。

儀器支持僅為所有儀器基于DTrace的文檔導(dǎo)出DTrace腳本。這意味著您的文檔可以包含自定義instruments和一些內(nèi)置instruments,例如庫調(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腳本選擇一個位置。
  • 5)點(diǎn)擊保存。

DTrace Script Export命令將儀器的腳本命令放置在文本文件中,然后可以使用-s選項(xiàng)將其傳遞到dtrace命令行工具。例如,如果您導(dǎo)出名為MyInstrumentsScript.d的腳本,請使用以下命令從終端運(yùn)行它:

sudo dtrace -s MyInstrumentsScript.d

注意:在大多數(shù)情況下,您必須擁有超級用戶權(quán)限才能運(yùn)行dtrace,這就是在前面的示例中使用sudo命令運(yùn)行dtrace的原因。

從Instruments導(dǎo)出腳本的另一個優(yōu)點(diǎn)(與手動編寫腳本相反)是,在運(yùn)行腳本之后,可以將結(jié)果數(shù)據(jù)導(dǎo)入到Instruments中并在其中查看。 從Instruments導(dǎo)出的腳本在DTrace輸出的開頭打印一個開始標(biāo)記(帶有文本dtrace_output_begin)。 要收集數(shù)據(jù),只需從終端復(fù)制所有DTrace輸出(包括開始標(biāo)記)并將其粘貼到文本文件中,或者直接將輸出從dtrace工具直接重定向到文件。 要在儀器中導(dǎo)入數(shù)據(jù),請選擇您生成原始腳本的跟蹤文檔,然后選擇File > DTrace Data導(dǎo)入。

后記

本篇主要講述了創(chuàng)建自定義Instruments,感興趣的給個贊或者關(guān)注~~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容