如果在执行 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 探测器。