Solaris 動的トレースガイド

ERROR プローブ

ERROR プローブは、DTrace プローブの節の実行中、実行時エラーが発生した場合に起動します。たとえば、次の例のように 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

エラーの原因となったプローブの有効化されたプローブ ID (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 プローブが再帰的に呼び出されることはありません。