Solaris 动态跟踪指南

宏变量

D 编译器定义了一组内置的宏变量,可以在编写 D 程序或解释程序文件时使用这些变量。宏变量是以美元符号 ($) 作为前缀的标识符,并在处理输入文件时由 D 编译器扩展一次。D 编译器提供了以下宏变量:

表 15–1 D 宏变量

名称 

说明 

参考 

$[0-9]+

宏参数 

请参见宏参数

$egid

有效组 ID 

getegid(2)

$euid

有效用户 ID 

geteuid(2)

$gid

实际组 ID 

getgid(2)

$pid

进程 ID 

getpid(2)

$pgid

进程组 ID 

getpgid(2)

$ppid

父进程 ID 

getppid(2)

$projid

项目 ID 

getprojid(2)

$sid

会话 ID 

getsid(2)

$target

目标进程 ID 

请参见目标进程 ID

$taskid

任务 ID 

gettaskid(2)

$uid

实际用户 ID 

getuid(2)

除了 $[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
{
	...
}

宏变量在每个探测器说明字段中仅扩展一次;它们不得包含探测器说明分界符 (:)。