共用方式為


DTrace

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

這個功能強大的工具支援各種數據收集和分析技術,包括匯總、直方圖,以及追蹤用戶層級事件。 您可以在腳本中 dtrace 指定探查,其中腳本會定義要監視的探查,以及在探查引發時要採取的動作。 探查是程式代碼中可收集數據以執行這些動作的特定點。

備註

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

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

啟用 DTrace

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

bcdedit /set dtrace on

需要重新啟動,此變更才會生效。

語法

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 產生具有靜態探查定義的頭檔。
-我 <probe-id> 啟用或列出符合指定探查標識符的探查,其中 probe-id 是要追蹤之探查的標識符。
-我 <path> 將指定的目錄新增至預處理器搜尋路徑,其中 path 是您要新增的目錄,其中包含 #include 檔案。
-l 列出根據 -P-m-f-n-i-s 參數比對指定準則的探查。 如果未指定這些參數,則會列出所有探查。
-L <path> 將指定的目錄新增至連結庫搜尋路徑,其中 path 是您要新增且包含一般定義的連結庫目錄。
-米 使用 provider:modulemodule 格式,啟用或列出符合自變數中指定模組名稱的探查。 如果未在模組名稱之外指定限定符,則會比對具有該模組名稱的所有探查。
-n 使用 provider:module:function:name、module:function:namefunction:name、function: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 腳本的符號搜尋路徑,其中 符號路徑 是包含符號之共用連結庫或目錄的路徑。 若要深入瞭解,請參閱 符號路徑
-Y 使用 dtrace 文本 的預設 符號搜尋路徑。
-Z 允許符合零探查以進行偵錯的探查描述。

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

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

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

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

  • Func:與探查相關聯的函式名稱。 例如,探查與函 syscall::NtReadFileread 相關聯。 您可以在文稿中 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 - 一行命令

另請參閱