ERROR プローブは、DTrace プローブの節の実行中、実行時エラーが発生した場合に起動します。たとえば、次の例のように 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 |
エラーの原因となったプローブの有効化されたプローブ 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 プローブが再帰的に呼び出されることはありません。