Solaris 动态跟踪指南

第 17 章 dtrace 提供器

dtrace 提供器提供了多个与 DTrace 本身相关的探测器。您可以使用这些探测器在开始跟踪前初始化状态,在完成跟踪后处理状态,并在其他探测器中处理意外的执行错误。

BEGIN 探测器

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

END 探测器在所有其他探测器之后触发。在所有其他探测器子句完成之前,将不会触发此探测器。此探测器可用于处理已收集的状态,或者格式化输出。因此printa() 操作通常在 END 探测器中使用。可以同时使用 BEGINEND 探测器来度量跟踪花费的总时间:

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 章


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

稳定性

dtrace 提供器使用 DTrace 的稳定性机制描述其稳定性,如下表所示。有关稳定性机制的更多信息,请参见第 39 章

元素 

名称稳定性 

数据稳定性 

相关性类 

提供器 

稳定 

稳定 

公用

模块 

专用 

专用 

未知 

功能 

专用 

专用 

未知 

名称 

稳定 

稳定 

公用

参数 

稳定 

稳定 

公用