dtrace 提供器提供了多个与 DTrace 本身相关的探测器。您可以使用这些探测器在开始跟踪前初始化状态,在完成跟踪后处理状态,并在其他探测器中处理意外的执行错误。
BEGIN 探测器在任何其他探测器之前触发。在所有 BEGIN 子句完成之前,将不会再触发任何其他探测器。此探测器可用于初始化其他探测器中需要的任何状态。以下示例说明如何使用 BEGIN 探测器初始化用于在 mmap(2) 保护位和文本说明之间进行映射的关联数组:
BEGIN { prot[0] = "---"; prot[1] = "r--"; prot[2] = "-w-"; prot[3] = "rw-"; prot[4] = "--x"; prot[5] = "r-x"; prot[6] = "-wx"; prot[7] = "rwx"; } syscall::mmap:entry { printf("mmap with prot = %s", prot[arg2 & 0x7]); }
BEGIN 探测器在未指定的上下文中触发。这表示,stack() 或 ustack() 的输出以及特定于上下文的变量(例如,execname)的值都是任意的。不应依赖于这些值,或者解释这些值来推断任何有意义的信息。BEGIN 探测器未定义任何参数。
END 探测器在所有其他探测器之后触发。在所有其他探测器子句完成之前,将不会触发此探测器。此探测器可用于处理已收集的状态,或者格式化输出。因此printa() 操作通常在 END 探测器中使用。可以同时使用 BEGIN 和 END 探测器来度量跟踪花费的总时间:
BEGIN { start = timestamp; } /* * ... other tracing actions... */ END { printf("total time: %d secs", (timestamp - start) / 1000000000); }
有关 END 探测器的其他常见用法,请参见数据标准化和printa()。
与 BEGIN 探测器一样,END 探测器没有定义任何参数。触发 END 探测器的上下文是任意的,不应依赖于该上下文。
跟踪时,如果 bufpolicy 选项已设置为 fill,则会保留足够的内存,以便容纳 END 探测器中跟踪的任何记录。有关详细信息,请参见fill 策略和 END 探测器。
exit() 操作将导致跟踪停止并触发 END 探测器。但是,调用 exit() 操作和触发 END 探测器之间会有一定延迟。在此延迟期间,将不会触发任何探测器。在探测器调用 exit() 操作之后,在 DTrace 使用者确定已调用 exit() 并停止跟踪之前,将不会触发 END 探测器。可以使用 statusrate 选项设置检查退出状态的速率。有关更多信息,请参见第 16 章。
如果在执行 DTrace 探测器的子句时发生运行时错误,将触发 ERROR 探测器。例如,如果子句尝试废除引用 NULL 指针,则将触发 ERROR 探测器,如下例所示。
BEGIN { *(char *)NULL; } ERROR { printf("Hit an error!"); }
运行此程序时,将会看到与以下示例类似的输出。
# dtrace -s ./error.d dtrace: script './error.d' matched 2 probes CPU ID FUNCTION:NAME 2 3 :ERROR Hit an error! dtrace: error on enabled probe ID 1 (ID 1: dtrace:::BEGIN): invalid address (0x0) in action #1 at DIF offset 12 dtrace: 1 error on CPU 2 |
该输出说明已触发 ERROR 探测器,还说明 dtrace(1M) 报告了错误。dtrace 可以独立启用 ERROR 探测器,从而允许该探测器报告错误。使用 ERROR 探测器时,可以创建您自己的自定义错误处理。
ERROR 探测器的参数如下所示:
arg1 |
引发错误的探测器的已启用探测器标识符 (enabled probe identifier, EPID) |
arg2 |
导致故障的操作的索引 |
arg3 |
该操作的 DIF 偏移,如果不适用则为 -1 |
arg4 |
故障类型 |
arg5 |
特定于故障类型的值 |
下表说明了各种故障类型以及 arg5 针对每种故障类型的值:
arg4 值 |
说明 |
arg5 含义 |
---|---|---|
DTRACEFLT_UNKNOWN |
未知故障类型 |
无 |
DTRACEFLT_BADADDR |
访问已取消映射或无效的地址 |
已访问的地址 |
DTRACEFLT_BADALIGN |
未正确配置的内存访问 |
已访问的地址 |
DTRACEFLT_ILLOP |
非法或无效操作 |
无 |
DTRACEFLT_DIVZERO |
整数被零除 |
无 |
DTRACEFLT_NOSCRATCH |
没有满足临时分配的足够临时空间 |
无 |
DTRACEFLT_KPRIV |
尝试使用不充分的权限访问内核地址或属性 |
已访问的地址,如果不适用则为 0 |
DTRACEFLT_UPRIV |
尝试使用不充分的权限访问用户地址或属性 |
已访问的地址,如果不适用则为 0 |
DTRACEFLT_TUPOFLOW |
DTrace 内部参数栈溢出 |
无 |
如果 ERROR 探测器本身采用的操作导致错误,则将默认删除该错误-不会递归调用 ERROR 探测器。
dtrace 提供器使用 DTrace 的稳定性机制描述其稳定性,如下表所示。有关稳定性机制的更多信息,请参见第 39 章。
元素 |
名称稳定性 |
数据稳定性 |
相关性类 |
---|---|---|---|
提供器 |
稳定 |
稳定 |
公用 |
模块 |
专用 |
专用 |
未知 |
功能 |
专用 |
专用 |
未知 |
名称 |
稳定 |
稳定 |
公用 |
参数 |
稳定 |
稳定 |
公用 |