第16 章• 选项和可调参数203
204
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";
}
17 第1 7 章
205
syscall::mmap:entry
{
printf("mmap with prot = %s", prot[arg2 & 0x7]);
}
BEGIN 探测器在未指定的上下文中触发。这表示,stack() 或ustack() 的输出以及特定于上
下文的变量(例如,execname)的值都是任意的。不应依赖于这些值,或者解释这些值来
推断任何有意义的信息。BEGIN 探测器未定义任何参数。
END 探测器
END 探测器在所有其他探测器之后触发。在所有其他探测器子句完成之前,将不会触发此探
测器。此探测器可用于处理已收集的状态,或者格式化输出。因此printa() 操作通常在END
探测器中使用。可以同时使用BEGIN 和END 探测器来度量跟踪花费的总时间:
BEGIN
{
start = timestamp;
}
/*
* ... other tracing actions...
*/
END
{
printf("total time: %d secs", (timestamp - start) / 1000000000);
}
END 探测器
206 Solaris 动态跟踪指南• 2006 年7 月
有关END 探测器的其他常见用法,请参见第122 页中的“数据标准化”和第169 页中的
“printa()”。
与BEGIN 探测器一样,END 探测器没有定义任何参数。触发END 探测器的上下文是任意的,
不应依赖于该上下文。
跟踪时,如果bufpolicy 选项已设置为fill,则会保留足够的内存,以便容纳END 探测器中
跟踪的任何记录。有关详细信息,请参见第160 页中的“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
ERROR 探测器
阅读(391) | 评论(0) | 转发(0) |