DTrace

从 Windows Server 2025 开始,dtrace 已作为内置工具提供。 DTrace 是一个命令行实用工具,让用户能够实时监控和调试系统性能。 通过使用 dtrace,用户可以动态检测内核和用户空间代码,而无需对代码本身进行修改。

这一功能强大的工具支持各种数据收集和分析技术,包括聚合、直方图和用户级事件跟踪。 探测可在 dtrace 脚本中指定,其中脚本定义了要监控的探测,以及探测触发时要采取的操作。 探测是代码中的一个特定点,可在其中收集数据以执行这些操作。

注意

dtrace 的内置端口与适用于 Windows 的 DTrace 的 MSI 安装程序在参数和其他功能方面有所不同。 要了解有关适用于 Windows 的 DTrace 的详细信息,请参阅 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 是所需的缓冲区大小,单位为字节、千字节 (k)、兆字节 (m) 或千兆字节 (g)。
-c <cmd> 运行指定的命令并在完成后退出,其中 cmd 是要在开始跟踪前运行的命令。 如果使用了多个 -c 实例,dtrace 会在所有命令运行完毕后退出,并报告每个子进程的退出状态。
C- 在运行跟踪之前对脚本文件运行 ucpp 预处理器。
-D <name>=<def> 在调用预处理器时定义一个符号,其中 name 是要定义的符号名称,而 def 是要分配给符号的可选值。
-e 在编译请求后但在启用探测之前退出。
-f 启用或列出与指定函数名称匹配的探测。
F- 按函数合并跟踪输出以便于分析。
-h 生成包含静态探测定义的头文件。
-i <probe-id> 启用或列出与指定探测 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> 获取指定的进程 ID (PID) 并缓存其符号表,该表可用于分析程序的行为。
-P <provider> 启用或列出与指定提供程序名称匹配的探测,其中 provider 是提供程序的名称。 可以同时使用多个 -P 参数实例。
-q 设置静音模式,只输出显式跟踪的数据。
-s <script> 根据指定的 D 脚本启用或列出探测,其中 script 是要运行的脚本的名称。 如果指定了 -e,则会编译程序但不进行数据收集。 如果指定了 -l,则编译程序并显示匹配的探测列表,但不进行数据采集。 如果未指定 -e-l,则编译程序,根据指定的探测进行数据收集并开始跟踪。
sqlcmd 打印用于调试到 stderr 的 D 语言编译器中间代码。
-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(默认值):提供带 K&R 兼容性扩展的 ISO C,并根据 ISO C 的要求对语义进行更改。调用 cpp 时,预定义宏 __STDC__ 的值为 0
  • -Xc(一致性):提供不带 K&R C 兼容性扩展的 ISO C 的严格符合性。 调用 cpp 时,预定义宏 __STDC__ 的值为 1
  • -Xs (K&R C):仅提供 K&R C,调用 cpp 时未定义 __STDC__ 宏。
  • -Xt(转换):提供带 K&R 兼容性扩展的 ISO C,而不根据 ISO C 的要求对语义进行更改。调用 cpp 时,预定义宏 __STDC__ 的值为 0
-y <symbol path> 设置 dtrace 脚本要解析的符号搜索路径,其中 symbol path 是指向包含符号的共享库或目录的路径。 要了解详细信息,请参阅符号路径
-y 对 dtrace 脚本使用 default 符号搜索路径。
Z- 允许与零探测匹配的探测描述用于调试。

以下列表描述了其余说明:

  • Predicate:谓词放在正斜杠 (/ /) 中,它是一个 D 表达式,即布尔表达式,可以引用变量、常量和函数。 谓词可用于根据这些事件来筛选 dtrace 的输出。 每次触发探测时都会对该表达式进行评估。 如果谓词的评估结果为 true,则执行关联的操作。

  • Action:操作放在大括号 ({ }) 中,是一组 D 语言语句,当探测触发且其相关谓词(如有)的评估结果为 true 时执行这些语句。 操作可用于打印输出语句、记录数据或执行其他操作,如发送信号或修改变量。

  • Module:提供程序的一个组件,其中包含一组相关探测。 可以在 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 入门 - 单行命令

另请参阅