INSTRUMENTS除錯工具的使用(三十三) —— 高階任務之建立自定義Instruments(二)...

weixin_33912246發表於2018-06-15

版本記錄

版本號 時間
V1.0 2018.06.15

前言

我們在做app的時候,不是做完功能就結束了,很多時候是需要進行檢查和優化的,而xcode自帶了一個很好的檢查工具,可以檢測記憶體洩漏。還可以檢視哪一個方法比較耗時。還可以檢測離屏渲染等等,隨後的幾篇我們就說一下這個工具的使用。感興趣的可以看這幾篇。
1.INSTRUMENTS除錯工具的使用(一)
2.INSTRUMENTS除錯工具的使用(二)
3.INSTRUMENTS除錯工具的使用(三)
4.INSTRUMENTS除錯工具的使用(四)
5.INSTRUMENTS除錯工具的使用(五)
6.INSTRUMENTS除錯工具的使用(六)
7.INSTRUMENTS除錯工具的使用(七)
8.INSTRUMENTS除錯工具的使用(八)
9.INSTRUMENTS除錯工具的使用(九)
10. INSTRUMENTS除錯工具的使用(十)
11. INSTRUMENTS除錯工具的使用(十一) —— 簡介(一)
12. INSTRUMENTS除錯工具的使用(十二) —— 通常任務之啟動Instruments(一)
13. INSTRUMENTS除錯工具的使用(十三) —— 通常任務之簡單瞭解Instruments(二)
14. INSTRUMENTS除錯工具的使用(十四) —— 通常任務之建立、儲存和開啟跟蹤文件(三)
15. INSTRUMENTS除錯工具的使用(十五) —— 通常任務之指定目標應用和裝置(四)
16. INSTRUMENTS除錯工具的使用(十六) —— 通常任務之訪問和使用個別儀器(五)
17. INSTRUMENTS除錯工具的使用(十七) —— 通常任務之記錄、暫停和停止跟蹤(六)
18. INSTRUMENTS除錯工具的使用(十八) —— 導航收集的資料之關於資料分析(一)
19. INSTRUMENTS除錯工具的使用(十九) —— 導航收集的資料之導航時間軸窗格(二)
20. INSTRUMENTS除錯工具的使用(二十) —— 導航收集的資料之導航詳細皮膚(三)
21. INSTRUMENTS除錯工具的使用(二十一) —— 導航收集的資料之將資料對映到原始碼(四)
22. INSTRUMENTS除錯工具的使用(二十二) —— 導航收集的資料之檢視您應用的原始碼(五)
23. INSTRUMENTS除錯工具的使用(二十三) —— 分析你App的效能之測量CPU使用情況(一)
24. INSTRUMENTS除錯工具的使用(二十四) —— 分析你App的效能之測量圖形效能(二)
25. INSTRUMENTS除錯工具的使用(二十五) —— 分析你App的效能之監視網路和檔案I / O(三)
26. INSTRUMENTS除錯工具的使用(二十六) —— 分析你App的記憶體使用之關於記憶體分析(一)
27. INSTRUMENTS除錯工具的使用(二十七) —— 分析你App的記憶體使用之檢測記憶體使用(二)
28. INSTRUMENTS除錯工具的使用(二十八) —— 分析你App的記憶體使用之找到廢棄的記憶體(三)
29. INSTRUMENTS除錯工具的使用(二十九) —— 分析你App的記憶體使用之找到記憶體洩露(四)
30. INSTRUMENTS除錯工具的使用(三十) —— 分析你App的記憶體使用之找到殭屍物件(五)
31. INSTRUMENTS除錯工具的使用(三十一) —— 分析你App的能源之測量能源影響(一)
32. INSTRUMENTS除錯工具的使用(三十二) —— 高階任務之匯出和匯入跟蹤資料(一)

Create Custom Instruments - 建立自定義Instruments

內建的Instruments提供了大量關於應用程式內部工作的資訊。 但是,有時候,您可能希望將這些資訊更貼近您自己的程式碼。 例如,不是每次呼叫函式時收集資料,您可能在收集資料時設定條件。 或者,您可能想要深入研究自己的程式碼,而不是內建instruments允許的程式碼。

重要:只要有可能,建議您使用現有儀器,而不是建立新儀器。 建立自定義instruments是一項高階功能。


About Custom Instruments - 關於自定義Instruments

自定義工具使用DTrace進行它們的行為。 DTrace是最初由Sun建立並移植到OS X的動態跟蹤工具。由於DTrace分入作業系統核心,它允許您訪問有關核心本身以及計算機上執行的使用者程式的低階資訊。許多內建儀器已經基於DTrace。 DTrace本身就是一個複雜的工具,但Instruments提供了一個簡單的介面,使您可以在不復雜的情況下訪問DTrace的強大功能。

DTrace尚未被移植到iOS,因此無法為執行iOS的裝置建立自定義instruments

重要:儘管定製儀器生成器簡化了建立DTrace探測器的過程,但在建立新儀器之前,您仍然應該熟悉DTrace及其工作原理。許多更強大的除錯和資料收集操作都要求您編寫DTrace指令碼。要了解DTrace和D指令碼語言,請參閱Oracle Technology Network提供的Solaris Dynamic Tracing Guide。有關dtrace命令列工具的資訊,請參閱dtrace(1) Mac OS X Manual Page

注意:若干Apple應用程式(即iTunes,DVD Player和使用QuickTime的應用程式)可防止通過DTrace(臨時或永久)收集資料,以保護敏感和受版權保護的資料。因此,在執行全系統資料收集時不要執行這些應用程式。

自定義儀器是使用DTrace探頭構建的。探針就像您放在程式碼中的感測器。它對應於DTrace可以繫結的位置或事件,例如函式入口點。當函式執行或事件生成時,關聯的探測器會觸發,並且DTrace將執行與探針關聯的任何操作。大多數DTrace操作僅收集有關作業系統和使用者應用程式行為的資料。但是,可以將自定義指令碼作為操作的一部分執行。使用指令碼可以使用DTrace的功能來微調您收集的資料。

每遇到探頭就會觸發,但與探頭相關的動作無需在每次探頭觸發時執行。謂詞是一個條件語句,允許您限制探測器的操作何時執行。例如,您可以將探測器限制為特定的過程或使用者,或者可以在儀器中的特定條件為真時執行操作。預設情況下,探頭沒有任何謂詞,這意味著每次探測器觸發時都會執行關聯的動作。然而,您可以將任意數量的謂詞新增到探針中,然後使用ANDOR運算子將它們連結在一起以建立複雜的決策樹。

自定義instrument由以下塊組成:

  • 說明塊,包含儀器的名稱,類別和說明
  • 一個或多個探針,每個探針都包含相關的動作和謂詞
  • 資料宣告區域,用於可選地宣告由所有探針共享的全域性變數
  • 開始指令碼,可以選擇初始化全域性變數並執行儀器所需的啟動任務
  • 結束指令碼,可以選擇執行最終的清理操作

自定義儀器必須至少具有一個與相關操作繫結的探針。同樣,自定義工具應具有適當的名稱和描述,以將其標識給Instruments使用者。儀器在庫調色盤中顯示此描述性資訊。提供良好的資訊可以讓您更輕鬆地記住儀器的功能以及應該如何使用。

探針不需要具有全域性資料宣告或開始和結束指令碼。當您想在探針之間共享資料或為儀器提供某種初始配置時,這些元素用於高階儀器設計。在 Write Custom Scripts中描述了建立資料,開始和結束塊。


Create a Custom Instrument - 建立一個自定義儀器

要建立自定義DTrace儀器,請選擇Instrument > Build New Instrument。 該命令顯示儀器配置對話方塊,如圖25-1所示。 您可以使用此表來指定您的儀器資訊,包括任何探針和自定義指令碼。

3691932-3449d93b95526d74.png

至少為您建立的每個自定義instrument提供以下資訊:

  • Name - 名稱。與您的自定義instrument在庫中關聯的名稱。
  • Category - 類別。儀器出現在庫中的類別。您可以指定現有類別的名稱(例如Memory)或建立您自己的類別。
  • Description - 描述。儀器說明,用於庫調色盤和儀器的工具提示中。
  • Probe provider - 探針提供者。探測器型別和應該何時觸發的細節。通常,這涉及指定探針所應用的方法或功能。請參閱Specify the Probe Provider
  • Probe action - 探測行動。探針觸發時要記錄的資料或要執行的指令碼,請參閱Add Actions to a Probe

儀器應至少包含一個探針,並可能包含多個探針。探針定義由提供者資訊,謂詞資訊和操作action組成。所有探針都必須至少指定提供者資訊,並且幾乎所有探針都定義了某種操作。探頭定義的謂詞部分是可選的,但是可以將您的儀器聚焦到正確的資料上,這是一個非常有用的工具。

1. Add and Delete Probes - 新增和刪除探針

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

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

3691932-fc6619be5dfff9f5.png
Figure 25-2 Adding or removing probes in the instrument configuration dialog

新增探針時,最好為探針提供一個描述性名稱。 預設情況下,Instruments為每個探針分配一個按順序編號的名稱,例如Probe 1Probe 2

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

要指定觸發探針的位置點或事件,請將相應的提供程式與探針相關聯。 提供者是充當DTrace代理的核心模組,提供建立探針所需的工具。 您不需要知道提供者如何操作來建立工具,但您確實需要了解每個提供者的基本功能。 表25-1列出了Instrument應用程式支援並可用於自定義儀器的提供程式。Provider列出了儀器配置對話方塊中顯示的名稱,而DTrace provider列列出了相應DTrace指令碼中使用的提供程式的實際名稱。

Table 25-1 DTrace providers

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

為您的探針選擇提供者後,指定探針所需的資訊。 例如,對於某些函式級別的探測器,提供者可能需要函式或方法名稱,以及程式碼模組或包含模組的類。 其他提供者可能只需要您從彈出式選單中選擇適當的事件。

配置好探針後,可以向其新增其他謂詞(以確定何時應該觸發),或者可以繼續為該探針定義操作。

3. Add Predicates to a Probe - 將謂詞新增到探針

通過Predicates可以控制何時由儀器執行探測器的操作。 您可以使用謂詞來防止儀器在您不需要時收集資料或認為資料可能是錯誤的。 例如,如果您的程式碼僅在堆疊達到特定深度時才會出現異常行為,請使用謂詞來指定最小目標堆疊深度。 每次探測器觸發時,儀器都會評估相關的謂詞。 只有當它們評估為真時,DTrace才會執行相關的操作。

To add a predicate to a probe - 將謂詞新增到探針

  • 1)點選探測條件中的新增按鈕(+)。
  • 2)選擇謂詞的型別。
  • 3)定義謂詞值。
3691932-9616b3e4a9261ce3.png

您可以使用探針或謂詞的新增按鈕(+)新增後續謂詞。要刪除謂詞,請單擊謂詞旁邊的刪除按鈕( - )。

儀器按照它們出現的順序從上到下評估謂詞。要重新排列謂詞,請單擊謂詞的行並將其拖到表中的新位置。您可以使用ANDOR運算子連結謂詞,但不能將它們分組以建立巢狀條件塊。相反,請仔細排列謂詞以確保檢查適當的條件。

使用謂詞行中的第一個彈出選單來選擇要檢查的資料作為條件的一部分。表25-2列出了您可以在謂詞或指令碼程式碼中使用的由DTrace定義的標準變數。Variable列列出了儀器配置皮膚中顯示的名稱,DTrace variable列列出了相應DTrace指令碼中使用的變數的實際名稱。除了測試標準變數外,還可以通過在謂詞欄位中指定自定義變數型別來測試指令碼程式碼中的自定義變數和常量。

Table 25-2 DTrace variables

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

除了指定要檢查的變數外,還必須指定一個比較運算子(等於,不等於,etc)以及用於與變數進行比較的值。

4. Add Actions to a Probe - 將操作新增到探針

當您的儀器定義的探測點被擊中並且探測的謂詞條件評估為真時,DTrace將執行與探測相關的操作。您可以使用探針的操作來收集資料或執行其他處理。例如,如果您的探針監視特定的函式或方法,則可以讓該函式的呼叫方和任何堆疊跟蹤資訊返回到Instruments。如果您想要稍微更高階的操作,可以使用指令碼變數來跟蹤呼叫該函式的次數並報告該資訊。如果您想要更高階的操作,可以編寫一個使用核心級DTrace函式的指令碼來確定函式使用的鎖的狀態。在後一種情況下,您的指令碼程式碼也可能會返回鎖的當前所有者(如果有的話),以幫助您確定程式碼的不同執行緒之間的互動。

圖25-3顯示了儀器配置對話方塊的指定探頭操作的部分。指令碼部分僅包含一個文字欄位,供您輸入指令碼程式碼。 (在將程式碼傳遞給DTrace之前,儀器不會驗證您的程式碼,因此請仔細檢查您的程式碼。)底部部分包含用於指定要DTrace返回到儀器的資料的控制元件。您可以使用彈出選單來配置要返回的內建DTrace變數。當第一個彈出選單設定為Record時,可以選擇從第二個彈出式選單中選擇Custom並返回其中一個指令碼變數。

3691932-504918f01f6ebb15.png
Figure 25-3 Configuring a probe’s action

當您將儀器配置為返回自定義變數時,Instruments會要求您提供以下資訊:

  • 包含資料的指令碼變數
  • 應用於儀器介面中的變數的名稱
  • 變數的型別

您的探針返回到儀器的任何資料都會收集並顯示在儀器的詳細資訊窗格中。詳細資訊窗格顯示所有資料變數,而不管型別。如果堆疊跟蹤資訊可用於特定探針,儀器會在儀器的檢查器窗格的擴充套件詳細資訊區域中顯示該資訊。另外,Instruments會自動查詢儀器返回的整數資料型別,並將這些型別新增到儀器可以在跟蹤窗格中顯示的統計資料列表中。

因為DTrace指令碼在核心空間中執行,並且Instruments應用程式在使用者空間中執行,所以如果要將基於自定義指標的指令碼變數的值返回給Instruments,則必須建立一個緩衝區來儲存變數的資料。建立緩衝區的最簡單方法是使用DTrace中的copyincopyinstr子例程。 copyinstr子例程接受一個指向C字串的指標,並以可返回到Instruments的形式返回該字串的內容。同樣,copyin子例程接受一個指標和size值,並向資料返回一個緩衝區,稍後您可以使用stringof關鍵字將其格式化為一個字串。這兩個子例程都是DTrace環境的一部分,可以從探測器操作定義的任何部分使用。例如,要從C風格的字串指標返回字串,只需使用copyinstr子例程封裝變數名稱,如圖25-4所示。

3691932-2f27251d67e6a960.png
Figure 25-4 Returning a string pointer

重要:如果變數型別設定為string,儀器會自動將內建變數(如arg0arg9函式引數)與呼叫copyinstr包裝在一起。 但是,Instruments不會自動包裝指令碼的自定義變數。 您有責任確保自定義變數中的資料實際上與為該變數指定的型別匹配。

有關儀器支援的內建變數列表,請參閱Table 25-2。 有關指令碼和指令碼變數的更多資訊,請參閱Write Custom Scripts。 有關DTrace子例程(包括copyincopyinstr子例程)的更多資訊,請參閱 Oracle Technology Network提供的Solaris Dynamic Tracing Guide


Write Custom Scripts - 寫自定義指令碼

您使用D指令碼語言編寫DTrace指令碼,其語法源自C程式語言的大部分子集。 D語言將C語言的程式設計結構與一組特殊的函式和變數相結合,以幫助您跟蹤應用程式中的資訊。

以下各節介紹在自定義instruments中使用指令碼的常用方法。這些部分不提供D語言的全面概述或編寫DTrace指令碼的過程。有關指令碼和D語言的資訊,請參閱Oracle Technology Network提供的Solaris Dynamic Tracing Guide

1. Write Begin and End Scripts - 編寫開始和結束指令碼

如果您想要做的不僅僅是當您的操作觸發時將DTrace內建變數中的資訊返回給Instruments,則需要編寫自定義指令碼。指令碼在核心級與DTrace直接互動,提供對核心和活動程式的低階資訊的訪問。大多數儀器使用指令碼來收集DTrace中不容易獲得的資訊。在將其返回給Instruments之前,您還可以使用指令碼來處理原始資料。例如,如果您想讓圖形化的值與Instruments軌道窗格中的其他值進行比較,可以使用指令碼將資料值標準化到特定的範圍。

在儀器中,自定義儀器配置對話方塊提供了幾個可編寫DTrace指令碼的區域:

  • 資料部分包含您想要在儀器中使用的任何全域性變數的定義。
  • 開始部分包含儀器的任何初始化程式碼。
  • 每個探針都包含指令碼程式碼作為其操作的一部分。
  • 結束部分包含儀器的清理程式碼。

所有指令碼部分都是可選的。如果你的儀器不需要它們,你不需要有初始化指令碼或清理指令碼。但是,如果您的儀器在其Data部分中定義了全域性變數,則建議您還提供初始化指令碼以將這些變數設定為已知值。 D語言不允許您為您的全域性變數宣告內聯賦值,因此您必須將這些賦值放在Begin部分。例如,簡單的資料部分可能由單個變數宣告組成,如下所示:

int myVariable;

然後相應的Begin部分將包含以下程式碼以初始化該變數:

myVariable = 0;

如果相應的探針操作更改myVariable的值,則可以使用探針的End部分來格式化並列印出變數的最終值。

大多數指令碼程式碼可能與單個探針相關聯。每個探測器可以有一個與其動作相關的指令碼。當需要執行探測動作時,DTrace首先執行您的指令碼程式碼,然後將所有請求的資料返回給Instruments。由於將資料傳回儀器涉及將資料從核心空間複製回儀器應用程式空間,因此應始終通過在儀器配置對話方塊的Record the following data部分中配置適當的條目將資料傳回儀器。從指令碼程式碼手動返回的變數可能無法正確返回到Instruments

2. Access Kernel Data from Custom Scripts - 從自定義指令碼訪問核心資料

因為DTrace指令碼在系統核心中執行,所以他們可以訪問核心符號。要在您的DTrace指令碼中檢視自定義工具中的全域性核心變數和資料結構,請在變數的名稱前加反引號字元(`)。反引號字元告訴DTrace在當前指令碼之外尋找指定的變數。

Listing 25-1顯示了一個示例動作指令碼,它從avenrun核心變數中檢索當前負載資訊,並使用該變數計算系統的一分鐘平均負載。如果使用Profile提供者建立探針,則可以讓此指令碼定期收集載入資料,然後在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 - 合理更改變數範圍

由於缺少流量控制語句和希望將探測執行時間降至最低,DTrace指令碼具有基本平坦的結構。 也就是說,您可以根據需要將DTrace指令碼中的變數範圍擴充套件到不同的級別。 表25-3列出了變數的範圍級別以及在每個級別使用變數的語法。

Table 25-3 Variable scope in DTrace scripts

Scope Syntax example Description
Global myGlobal = 1; 全域性變數由變數名稱標識。 所有系統執行緒上的所有探測動作都可以訪問此空間中的變數。
Thread self->myThreadVar = 1; 執行緒區域性變數從self關鍵字中取消引用。 在同一個執行緒上執行的所有探測器操作都可以訪問此空間中的變數。 您可以使用此作用域在當前執行緒的多次探測操作過程中收集資料。
Probe this->myLocalVar = 1; 探針區域性變數使用this關鍵字取消引用。 只有當前執行的探針才能訪問此空間中的變數。 通常,使用此作用域來定義在當前操作結束時希望核心清理的臨時變數。

4. Find Script Errors - 找到指令碼錯誤

如果其中一個自定義instruments的指令碼程式碼包含錯誤,則當DTrace編譯指令碼時,instruments會在軌道窗格中顯示錯誤訊息。 儀器在跟蹤文件中單擊Record按鈕後,但在跟蹤實際開始之前報告錯誤。 錯誤訊息內部是一個編輯按鈕。 點選此按鈕可開啟儀器配置對話方塊,該對話方塊現在可識別帶有錯誤的探針。


Export and Import DTrace Scripts - 匯出和匯入DTrace指令碼

雖然儀器為收集跟蹤資料提供了一個方便的介面,但有時使用DTrace直接收集跟蹤資料更為方便。例如,如果您是系統管理員或正在編寫自動化測試指令碼,則您可能更願意使用DTrace命令列介面啟動程式並收集資料。使用命令列工具需要您編寫自己的DTrace指令碼,這可能會耗費時間並可能導致錯誤。如果你已經有一個或多個基於DTrace的instruments檔案,你可以使用instruments產生DTrace指令碼,這與您的跟蹤文件中的儀器一樣,都是相同的行為。

儀器支援僅為所有儀器基於DTrace的文件匯出DTrace指令碼。這意味著您的文件可以包含自定義instruments和一些內建instruments,例如庫調色盤中的檔案系統相關和Core Data instruments。

To export a DTrace script - 匯出DTrace指令碼

  • 1)選擇跟蹤文件。
  • 2)選擇File > DTrace Script Export
  • 3)輸入DTrace指令碼的名稱。
  • 4)為DTrace指令碼選擇一個位置。
  • 5)點選儲存。

DTrace Script Export命令將儀器的指令碼命令放置在文字檔案中,然後可以使用-s選項將其傳遞到dtrace命令列工具。例如,如果您匯出名為MyInstrumentsScript.d的指令碼,請使用以下命令從終端執行它:

sudo dtrace -s MyInstrumentsScript.d

注意:在大多數情況下,您必須擁有超級使用者許可權才能執行dtrace,這就是在前面的示例中使用sudo命令執行dtrace的原因。

從Instruments匯出指令碼的另一個優點(與手動編寫指令碼相反)是,在執行指令碼之後,可以將結果資料匯入到Instruments中並在其中檢視。 從Instruments匯出的指令碼在DTrace輸出的開頭列印一個開始標記(帶有文字dtrace_output_begin)。 要收集資料,只需從終端複製所有DTrace輸出(包括開始標記)並將其貼上到文字檔案中,或者直接將輸出從dtrace工具直接重定向到檔案。 要在儀器中匯入資料,請選擇您生成原始指令碼的跟蹤文件,然後選擇File > DTrace Data匯入。

後記

本篇主要講述了建立自定義Instruments,感興趣的給個贊或者關注~~~~

3691932-6f66c753bcbc2dc2.jpg

相關文章