D 编译器定义了一组内置的宏变量,可以在编写 D 程序或解释程序文件时使用这些变量。宏变量是以美元符号 ($) 作为前缀的标识符,并在处理输入文件时由 D 编译器扩展一次。D 编译器提供了以下宏变量:
表 15–1 D 宏变量| 名称 | 说明 | 参考 | 
|---|---|---|
| $[0-9]+ | 宏参数 | 请参见宏参数 | 
| $egid | 有效组 ID | |
| $euid | 有效用户 ID | |
| $gid | 实际组 ID | |
| $pid | 进程 ID | |
| $pgid | 进程组 ID | |
| $ppid | 父进程 ID | |
| $projid | 项目 ID | |
| $sid | 会话 ID | |
| $target | 目标进程 ID | 请参见目标进程 ID | 
| $taskid | 任务 ID | |
| $uid | 实际用户 ID | 
除了 $[0-9]+ 宏参数和 $target 宏变量以外,所有宏变量都扩展为与系统属性(如进程 ID 和用户 ID)对应的整数。变量扩展为与当前 dtrace 进程本身或正在运行 D 编译器的任何进程关联的属性值。
通过在解释程序文件中使用宏变量,可以创建持久性的 D 程序,每次使用这些程序时无需对其进行编辑。例如,要统计除 dtrace 命令执行的系统调用以外的所有系统调用,可以使用包含 $pid 的以下 D 程序子句:
syscall:::entry
/pid != $pid/
{
	@calls = count();
}
即使每次调用 dtrace 命令都将得到不同的进程 ID,此子句也始终会生成所需的结果。
D 程序中可使用整数、标识符或字符串的任何位置均可使用宏变量。在解析输入文件时,将只扩展宏变量一次(即,不递归扩展)。每个扩展的宏变量形成一个单独的输入标记,不能与其他文本串联生成单个标记。例如,如果 $pid 扩展为值 456,则 D 代码:
123$pid
将扩展为两个相邻的标记 123 和 456,这将导致语法错误,而不会生成单个整数标记 123456。
宏变量在程序子句的开始位置扩展,并与 D 探测器说明内部的相邻文本串联。例如,以下子句使用 DTrace pid 提供器检测 dtrace 命令:
pid$pid:libc.so:printf:entry
{
	...
}
宏变量在每个探测器说明字段中仅扩展一次;它们不得包含探测器说明分界符 (:)。