Solaris 动态跟踪指南

探测器说明

每条 D 程序子句都以一个或多个探测器说明的列表开头,每个说明都采用以下常见形式:

提供器:模块:函数:名称

如果省略探测器说明中的一个或多个字段,D 编译器将从右向左解释指定的字段。例如,探测器说明 foo:bar 将匹配包括函数 foo 和名称 bar 的探测器,而不考虑探测器的提供器和模块字段的具体值。所以,探测器说明更准确地说是一种模式,可用于根据名称匹配一个或多个探测器。

应编写指定所有四个字段分界符的 D 探测器说明,以便可以在左侧指定所需的提供器。如果未指定提供器,在多个提供器以相同的名称发布探测器时可能会得到意外的结果。类似地,将来版本的 DTrace 可能包括新的提供器,这些提供器的探测器可能会无意中与所指定的探测器说明部分匹配。可以指定提供器,但保留所有模块、函数和名称字段为空,以与提供器的任何探测器匹配。例如,说明 syscall::: 可用于匹配 DTrace syscall 提供器发布的每个探测器。

探测器说明还支持与 shell globbing 模式匹配语法(如 sh(1) 中所述)类似的模式匹配语法。在将探测器与说明匹配之前,DTrace 将在每个说明字段中扫描字符 *?[。如果这些字符中的某一个出现在探测器说明字段中,并且前面没有 \,则会将该字段视为一种模式。说明模式必须与给定探测器的整个相应字段匹配。要成功匹配和启用探测器,完整的探测器说明必须与每个字段匹配。非模式的探测器说明字段必须与该探测器的相应字段完全匹配。空的说明字段将与任何探测器匹配。

下表中是探测器名称模式中可识别的特殊字符:

表 4–1 与字符匹配的探测器名称模式

符号 

说明 

*

匹配任何字符串,包括空字符串。 

?

匹配任何单个字符。 

[ ... ]

匹配任何一个封闭字符。使用 - 分隔的一对字符将匹配这对字符之间的任何字符,包括这对字符。如果 [ 之后的第一个字符是 !,则将与集合中未包括的任何字符匹配。

\

将下一个字符解释为其本身,不具有任何特殊含义。 

可以在探测器说明的任何或所有四个字段中使用模式匹配字符。通过在命令行中将模式与 dtrace -l 一起使用,也可以使用模式列出匹配的探测器。例如,命令 dtrace -l -f kmem_* 列出函数中名称以前缀 kmem_ 开头的所有 DTrace 探测器。

如果要为多个探测器说明或说明模式指定相同的谓词和操作,可以将说明放置在逗号分隔的列表中。例如,以下 D 程序将跟踪每次触发探测器时的时间标记,这些探测器与包含单词 "lwp" 或 "sock" 的系统调用入口关联:

syscall::*lwp*:entry, syscall::*sock*:entry
{
	trace(timestamp);
}

探测器说明也可以使用其整数探测器 ID 指定探测器。例如,子句:

12345
{
	trace(timestamp);
}

可用于启用由 dtrace -l -i 12345 报告的探测器 ID 12345。应始终使用人工可读的探测器说明编写 D 程序。装入和卸载 DTrace 提供器内核模块时或者在重新引导后,不能保证整数探测器 ID 仍然不变。