从 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:name、function:name、function:name 或 name 启用或列出与参数中的指定探测名称匹配的探测。 如果未在探测名称之外指定限定符,则匹配具有该名称的所有探测。 |
-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 标准的方式。 可用参数包括:
|
-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 - 一行命令入门。