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 的参数 区分大小写。 请确保在指定参数时使用正确的大小写以避免任何意外行为。

参数 DESCRIPTION
-b <bufsz> 设置用于存储跟踪数据的缓冲区的大小,其中 bufsz 是缓冲区的所需大小(以字节为单位)、千字节(k)、兆字节(m)或千兆字节(g)。
-c <cmd> 运行指定的命令,并在它完成后退出,其中 cmd 是在启动跟踪之前要运行的命令。 如果使用了多个 -c 实例,则当所有命令完成运行并报告每个子进程的退出状态时,dtrace 将退出。
C- 在运行跟踪之前,在脚本文件上运行 ucpp 预处理器。
-D <name>=<def> 调用预处理器时定义符号,其中 名称 是要定义的符号的名称, def 是分配给符号的可选值。
-e 编译请求后退出,但在启用探测之前退出。
-f 启用或列出与指定函数名称匹配的探测。
-F 按函数合并跟踪输出,使其更易于分析。
-H 生成包含静态探测定义的头文件。
-我 <probe-id> 启用或列出与指定探测 ID 匹配的探测,其中 探测 ID 是要跟踪的探测的标识符。
-我 <path> 将指定的目录添加到预处理器搜索路径,其中 路径 是要添加的目录,其中包含 #include 文件。
-l 列出根据 -P-m-f-n-i-s 参数匹配指定条件的探测。 如果未指定这些参数,将列出所有探测。
-L <path> 将指定的目录添加到库搜索路径,其中 路径 是要添加的包含常见定义的库目录。
-m 启用或列出使用 provider:module或 module 格式的参数中与指定模块名称匹配的探测。 如果未在模块名称之外指定限定符,则匹配具有该模块名称的所有探测。
-n 使用 provider:module:function:name、module:function:namefunction:name、function:namename 启用或列出与参数中的指定探测名称匹配的探测。 如果未在探测名称之外指定限定符,则匹配具有该名称的所有探测。
-o <output> 设置跟踪数据的输出文件,其中 输出 是要用于跟踪数据的文件的名称。
-p <pid> 获取指定的进程 ID(PID)并缓存其符号表,该表可用于分析程序的行为。
-P <provider> 启用或列出与指定提供程序名称匹配的探测,其中 提供程序 是提供程序的名称。 可以同时使用 -P 参数的多个实例。
-q 设置静默模式,该模式仅输出显式跟踪的数据。
-s <script> 根据指定的 D 脚本启用或列出探测,其中 脚本 是要运行的脚本的名称。 如果指定 了 -e ,则编译程序,但不执行数据收集。 如果指定 了 -l ,则编译程序并显示匹配的探测列表,但不执行数据收集。 如果未指定 -e-l ,则编译程序,将根据指定的探测执行数据收集,并开始跟踪。
sqlcmd 打印用于调试到 stderr 的 D 语言编译器中间代码。
-U <name> 调用预处理器时取消定义符号,其中 名称 是要取消定义符号的名称。
-v 设置详细模式,用于报告稳定性属性和参数。
-V 显示 dtrace API 的版本。
-w 允许使用 -s-P-m-f-n-i 参数指定的破坏性作。 破坏性作可能包括修改内核变量、更改系统调用的行为或系统崩溃等作。
-x <opt>=<val> 启用或禁用编译器和跟踪选项,其中 选择 是要启用或修改的选项的名称, val 是一个可选值。
-X <a|c|s|t> 控制在调用 cpp 时,要编译的 C 代码遵守 ISO C 标准的方式。 可用参数包括:
  • -Xa (默认值):提供 ISO C 和 K&R 兼容性扩展,并提供 ISO C 所需的语义更改。调用 cpp 时,预定义宏__STDC__的值为 0
  • -Xc (一致性):提供不带 K&R C 兼容性扩展的 ISO 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 表达式,它是一个布尔表达式,可以引用变量、常量和函数。 谓词可用于基于这些事件的输出 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 - 一行命令入门

另请参阅