Solaris 動的トレースガイド

第 17 章 dtrace プロバイダ

dtrace プロバイダは、DTrace 自体に関連するプローブを提供します。これらのプローブを使って、トレース開始前に状態を初期化したり、トレースの完了後に状態を処理したり、ほかのプローブで発生した予期せぬ実行エラーを処理したりできます。

BEGIN プローブ

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 プローブは、一番最後に起動するプローブです。このプローブは、ほかのすべてのプローブ節が完了するまで起動しません。このプローブを使って、収集された状態を処理したり、出力に書式を設定したりできます。このため、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 プローブ

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 プローブが再帰的に呼び出されることはありません。

安定性

以下の表に、dtrace プロバイダの安定性を DTrace の安定性機構に従って示します。安定性機構の詳細については、第 39 章安定性を参照してください。

要素 

名前の安定性 

データの安定性 

依存クラス 

プロバイダ 

安定 

安定 

共通

モジュール 

非公開 

非公開 

不明 

機能 

非公開 

非公開 

不明 

名前 

安定 

安定 

共通

引数 

安定 

安定 

共通