从 Windows Server 2025 开始, dtrace 作为内置工具包含在内。 DTrace 是一个命令行实用工具,允许用户实时监视和调试其系统性能。 借助 dtrace,用户可以动态检测内核和用户空间代码,而无需修改代码本身。
此功能强大的工具支持各种数据收集和分析技术,包括聚合、直方图和用户级事件的跟踪。 可以在脚本中 dtrace 指定探测,其中脚本定义了要监视的探测,以及探测触发时要执行的作。 探测是代码中的一个特定点,可在其中收集数据来执行这些作。
Note
此内置端口 dtrace 不同于适用于 Windows 的 DTrace 的 MSI 安装程序周围的参数和其他功能。 若要了解有关适用于 Windows 的 DTrace 的详细信息,请参阅 Windows 上的 DTrace。
有关使用 DTrace 的综合指南,请参阅 动态跟踪指南。
Enable 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 ... ]
Note
dtrace.exe 的参数 区分大小写。 请确保在指定参数时使用正确的大小写以避免任何意外行为。
| Parameter | Description |
|---|---|
-b <bufsz> |
设置用于存储跟踪数据的缓冲区的大小,其中 bufsz 是缓冲区的所需大小,单位为字节、千字节 (k)、兆字节 (m) 或千兆字节 (g)。 |
-c <cmd> |
运行指定的命令并在完成后退出,其中 cmd 是您要在开始跟踪之前运行的命令。 如果使用了多个 -c 实例,那么当所有命令都完成运行时,dtrace 将退出,并报告每个子进程的退出状态。 |
| -C | 在运行跟踪之前,在脚本文件上运行 ucpp 预处理器。 |
-D <name>=<def> |
在调用预处理器时定义一个符号,其中 name 是要定义的符号的名称, def 是要分配给符号的可选值。 |
| -e | 编译请求后退出,但在启用探测之前退出。 |
| -f | 启用或列出与指定函数名称匹配的探测。 |
| -F | 按函数合并跟踪输出,使其更易于分析。 |
| -h | 生成包含静态探测定义的头文件。 |
-我 <probe-id> |
启用或列出与指定探测 ID 匹配的探测,其中 probe-id 是要跟踪的探测的标识符。 |
-我 <path> |
将指定的目录添加到预处理器搜索路径,其中 path 是要添加的包含 #include 文件的目录。 |
| -l | 根据 -P、 -m、 -f、 -n、 -i 和 -s 参数列出与指定条件匹配的探测。 如果未指定这些参数,将列出所有探测。 |
-L <path> |
将指定的目录添加到库搜索路径,其中 path 是要添加的包含公共定义的库目录。 |
| -m | 使用 格式 provider:module 或 module 启用或列出与参数中指定模块名称匹配的探测。 如果未在模块名称之外指定限定符,则匹配具有该模块名称的所有探测。 |
| -n | 使用 provider:module:function:name、 module:function:name、 function:name 或 name 格式启用或列出与参数中指定探针名称匹配的探针。 如果未在探测名称之外指定限定符,则匹配具有该名称的所有探测。 |
-o <output> |
设置跟踪数据的输出文件,其中 输出 是要用于跟踪数据的文件的名称。 |
-p <pid> |
获取指定的进程 ID(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 标准的方式。 可用参数包括:
|
-y <symbol path> |
设置要解析的 dtrace 脚本的符号搜索路径,其中 符号路径 是包含符号的共享库或目录的路径。 要了解更多信息,请参阅 符号路径。 |
| -Y | 使用 dtrace 脚本的 默认 符号搜索路径。 |
| -Z | 允许与零个探测匹配的探测说明进行调试。 |
以下列表描述了其余说明:
谓词:谓词用正斜杠 (
/ /) 括起来,是一个 D 表达式,它是一个可以引用变量、常量和函数的布尔表达式。 谓词可用于基于这些事件的输出dtrace进行筛选。 每次探测触发时都会计算此表达式。 如果谓词的计算结果为 true,则执行关联的作。作:该作用大括号 (
{ }) 括起来,是一组 D 语言语句,当探测触发时执行,并且其关联的谓词(如果有)的计算结果为 true。 作可用于打印输出语句、记录数据或执行其他作,例如发送信号或修改变量。模块:提供程序的组件,包含一组相关探测。 可以在脚本中
dtrace指定模块,将脚本的范围限制为特定模块或模块集。Func:与探测关联的函数名称。 例如,
syscall::NtReadFile探测与read函数相关联。 可以在脚本中dtrace指定函数,将脚本的范围限制为特定函数或函数集。Args:当探测触发时传递给作表达式的参数及其关联的谓词(如果有)的计算结果为 true。 Args 可用于从探测上下文中捕获数据,例如函数参数的值或系统调用返回值。 Args 还可用于在探测之间传递数据,或修改脚本的行为。
Examples
若要跟踪所有系统调用,请打印可执行文件的名称和要进行的系统调用的名称,请运行:
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 - 一行命令入门。