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() アクションがよく使用されます。BEGIN プローブと END プローブを組み合わせると、トレースにかかった合計時間を測定できます。
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 プローブの節の実行中、実行時エラーが発生した場合に起動します。たとえば、次の例のように 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 プローブが再帰的に呼び出されることはありません。
以下の表に、dtrace プロバイダの安定性を DTrace の安定性機構に従って示します。安定性機構の詳細については、第 39 章安定性を参照してください。
要素 |
名前の安定性 |
データの安定性 |
依存クラス |
---|---|---|---|
プロバイダ |
安定 |
安定 |
共通 |
モジュール |
非公開 |
非公開 |
不明 |
機能 |
非公開 |
非公開 |
不明 |
名前 |
安定 |
安定 |
共通 |
引数 |
安定 |
安定 |
共通 |