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:module 或 module 格式启用或列出与参数中指定模块名称匹配的探测。 如果除模块名称外未指定限定符,则会匹配所有具有该模块名称的探测。 |
-n | 使用 provider:module:function:name、module:function:name、function:name 或 name 格式,启用或列出与参数中指定探测名称匹配的探测。 如果除探测名称外未指定限定符,则会匹配所有具有该名称的探测。 |
-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 标准的严格程度。 可用的参数包括:
|
-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 入门 - 单行命令。