Solaris 动态跟踪指南

ERROR 探测器

如果在执行 DTrace 探测器的子句时发生运行时错误,将触发 ERROR 探测器。例如,如果子句尝试废除引用 NULL 指针,则将触发 ERROR 探测器,如下例所示。


示例 17–1 error.d:记录错误

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 探测器。