Share via


DTrace

從 Windows Server 2025 開始,dtrace 為內建工具。 DTrace 是命令行公用程式,可讓使用者即時監視和偵錯系統效能。 透過 dtrace,使用者可以動態檢測核心程序和使用者空間程式碼,而不需要修改程式碼本身。

這個功能強大的工具支援各種資料收集和分析技術,包括匯總、長條圖,以及追蹤使用者層級事件。 可以在 dtrace 指令碼中指定探查,其中指令碼會定義要監視的探查以及探查觸發時要採取的動作。 探查是程式碼中的一個特定點,可以在其中收集資料以執行這些動作。

注意

dtrace 的此內建連接埠與 DTrace for Windows 周圍參數和其他功能的 MSI 安裝程式不同。 若要深入瞭解 DTrace for Windows,請參閱 Windows 上的 DTrace

如需 DTrace 完整使用指南,請參閱動態追蹤指南

啟用 DTrace

必須先啟用 dtrace,才能使用它。 若要啟用 dtrace,請以系統管理員身分開啟提升權限的命令提示字元或 PowerShell,然後執行:

bcdedit /set dtrace on

需要重新啟動才能使此變更生效。

Syntax

dtrace [-BCeFhlqSvVwYZ] [-b bufsz] [-c cmd] [-D name[=def]] [-I path]
[-L path] [-o output] [-p pid] [-s script] [-U name] [-x opt[=val]] [-X a|c|s|t]
[-y symbol path]

[-P provider [[ predicate ] action ]] [-m [ provider: ]
module [[ predicate ] action ]] [-f [[ provider: ] module: ]
func [[ predicate ] action ]] [-n [[[ provider: ] module: ] func: ]
name [[ predicate ] action ]] [-i probe-id [[ predicate ] action ]] [ args ... ]

注意

dtrace.exe 的參數會區分大小寫。 請務必在指定參數時使用正確的大小寫,以避免發生任何非預期的行為。

參數 描述
-b <bufsz> 設定用於儲存追蹤資料的緩衝區大小,其中 bufsz 是所需的緩衝區大小,以位元組、KB (k)、MB (m) 或 GB (g) 為單位。
-c <cmd> 執行指定的命令,並在完成之後結束,其中 cmd 是您想要在啟動追蹤之前執行的命令。 如果使用多個 -c 執行個體,則 dtrace 將在所有命令完成執行時結束並報告每個子處理序的結束狀態。
-C 在執行追蹤之前,先對指令碼檔案執行 ucpp 前置處理器。
-D <name>=<def> 叫用前置處理器時定義符號,其中 name 是要定義的符號其名稱,def 是指派給符號的選擇性值。
-e 在編譯要求之後但在啟用探查之前結束。
-f 啟用或列出符合所指定函式名稱的探查。
-F 依函式結合追蹤輸出,讓您更容易分析。
-h 產生具有靜態探查定義的標頭檔。
-i <probe-id> 啟用或列出符合所指定探查識別碼的探查,其中 probe-id 是要追蹤之探查的識別碼。
-I <path> 將指定的目錄新增至前置處理器搜尋路徑,其中 path 是您想要新增的目錄,其中包含 #include 檔案。
-l 根據 -P-m-f-n-i-s 參數,列出符合所指定準則的探查。 如果未指定這些參數,則會列出所有探查。
-L <path> 將指定的目錄新增至程式庫搜尋路徑,其中 path 是您要新增且包含通用定義的程式庫目錄。
-m 啟用或列出與引數中指定模組名稱相符的探查,使用 provider:modulemodule 格式 如果未在模組名稱之外指定限定詞,則會比對具有該模組名稱的所有探查。
-n 啟用或列出與引數中指定探查名稱相符的探查,使用 provider:module:function:namemodule:function:namefunction:namename 格式。 如果未在探查名稱之外指定限定詞,則會比對具有該名稱的所有探查。
-o <output> 設定追蹤資料的輸出檔案,其中 output 是您要用於追蹤資料的檔案名稱。
-p <pid> 擷取指定的處理序識別碼 (PID) 並快取其符號表,可用來分析處理序的行為。
-P <provider> 啟用或列出符合指定提供者名稱的探查,其中 provider 是提供者的名稱。 可以同時使用多個 -P 參數執行個體。
-q 設定無訊息模式,其只會輸出明確追蹤的資料。
-s <script> 根據指定的 D 指令碼啟用或列出探查,其中 script 是您想要執行的指令碼名稱。 如果有指定 -e,則會編譯程式,但不會執行資料收集。 如果有指定 -l,則會編譯程式,並顯示相符的探查清單,但不會執行資料收集。 如果未 -e-l 則會編譯程式,根據指定的探查執行資料收集,並開始追蹤。
-S 將用於偵錯的 D 語言編譯器中間程式碼列印到 stderr
-U <name> 叫用前置處理器時取消定義符號,其中 name 是您要取消定義之符號的名稱。
-v 設定詳細資訊模式,其會報告穩定性屬性和引數。
-V 顯示 dtrace API 的版本。
-w 使用 -s-P-m-f-n-i 參數指定時,允許破壞性動作。 破壞性動作可以包括修改核心變數、變更系統呼叫的行為,或損毀系統等動作。
-x <opt>=<val> 啟用或修改編譯器和追蹤選項,其中 opt 是您想要啟用或修改的選項名稱,而 val 是選擇性值。
-X <a|c|s|t> 控制呼叫 cpp 時,正在編譯的 C 程式碼遵守 ISO C 標準的嚴格程度。 可用的引數:
  • -Xa (預設):提供 ISO C 加 K&R 相容性延伸模組以及 ISO C 所需的語意變更。叫用 cpp 時,預先定義的巨集 __STDC__ 的值為 0
  • -Xc (一致性):提供嚴格的 ISO C 一致性,而不需要 K&R C 相容性延伸模組。 叫用 cpp 時,預先定義的巨集 __STDC__ 的值為 1
  • -Xs (K&R C):僅提供 K&R C,且叫用 cpp 時不會定義 __STDC__ 巨集。
  • -Xt (轉換):提供 ISO C 加上 K&R C 相容性延伸模組,無 ISO C 所需的語意變更。叫用 cpp 時,預先定義的巨集 __STDC__ 的值為 0
-y <symbol path> 設定 dtrace 指令碼要解析的符號搜尋路徑,其中 symbol path 是包含符號之共用程式庫或目錄的路徑。 若要了解詳細資訊,請參閱 符號路徑
-y 使用 dtrace 指令碼的預設符號搜尋路徑。
-Z 允許符合零探查以進行偵錯的探查描述。

下列清單說明其餘的描述:

  • 述詞:述詞會以正斜線 (/ /) 括住,而且是 D 運算式,這是可參考變數、常數和函式的布林運算式。 述詞可用來根據這些事件篩選 dtrace 的輸出。 每次觸發探查時,都會評估此運算式。 如果述詞評估為 true,則會執行相關聯的動作。

  • 動作:動作會以大括弧 ({ }) 括住,而且是一組 D 語言陳述式,其會在探查觸發及其相關聯的述詞 (若有) 評估為 true 時執行。 動作可用來列印輸出陳述式、記錄資料或執行其他作業,例如傳送訊號或修改變數。

  • 模組:提供者的元件,其中包含一組相關的探查。 可以在 dtrace 指令碼中指定模組,以將指令碼的範圍限制為特定模組或一組模組。

  • Func:與探查相關聯的函式名稱。 例如,syscall::NtReadFile 探查與 read 函式相關聯。 可以在 dtrace 指令碼中指定函式,以將指令碼的範圍限制為特定函式或一組函式。

  • Args:當探查觸發及其相關聯的述詞 (若有) 評估為 true 時,傳遞給動作運算式的引數。 Args 可用來從探查內容擷取資料,例如函式引數的值或系統呼叫傳回值。 Args 也可以用來在探查之間傳遞資料,或修改指令碼的行為。

範例

若要追蹤所有系統呼叫,請列印可執行檔的名稱,以及要進行的系統呼叫名稱,執行:

dtrace -n 'syscall:::entry { printf("%s called syscall %s", execname, probefunc); }'

該命令追蹤具有指定之 PID 的處理序中的「function_name」函式,並列印函式的名稱、呼叫它的處理序其 PID,以及可執行檔的名稱。

dtrace -n 'pid$target::function_name:entry { printf("Function %s called by process %d (%s)", probefunc, pid, execname); }' -p <PID>

如需使用 dtrace的進一步範例,請參閱 開始使用 DTrace - 一行命令

另請參閱