Solaris 動的トレースガイド

プロバイダとプローブ

上記の例では、BEGINEND という 2 つの単純なプローブの使用方法について学習しました。これらのプローブは、どこから提供されたものなのでしょうか。DTrace のプローブは、「プロバイダ」と呼ばれるカーネルモジュールのセットから提供されています。プロバイダはそれぞれ、プローブを作成して特定の計測機能を実行します。各プロバイダは、DTrace の使用時に、DTrace フレームワークに提供可能なプローブを発行するチャンスを与えられます。その後、ユーザーは、トレースアクションを有効にし、発行された任意のプローブに結合します。システム上で使用可能な全プローブを一覧するには、次のコマンドを入力します。


# dtrace -l
  ID   PROVIDER            MODULE          FUNCTION NAME
   1     dtrace                                     BEGIN
   2     dtrace                                     END
   3     dtrace                                     ERROR
   4   lockstat           genunix       mutex_enter adaptive-acquire
   5   lockstat           genunix       mutex_enter adaptive-block
   6   lockstat           genunix       mutex_enter adaptive-spin
   7   lockstat           genunix       mutex_exit  adaptive-release

   ... many lines of output omitted ...

#

すべての内容が出力されるまで、多少時間がかります。プローブの総数を表示するには、次のコマンドを入力します。


# dtrace -l | wc -l
        30122

プローブの数は、使用するオペレーティングプラットフォームと、インストールされているソフトウェアの種類によって異なります。このため、このコマンドで出力される値は、マシンによって異なります。利用可能なプローブは膨大な数にのぼります。これらを利用して、システムの動作を隅々まで詳しく確認できます。厳密には、上のコマンドで出力された数に加えて、その他のプローブも利用できます。あとで見ていきますが、一部のプロバイダは、ユーザーのトレース要求に応じて直接、新しいプローブを作成できます。したがって、利用可能な DTrace プローブは、事実上無限にあることになります。

端末ウィンドウ内の dtrace -l の出力をもう 1 度見てください。前述したように、各プローブには、整数値の ID と人間が読める形式の名前があります。人間が読める形式の名前は 4 つの部分で構成され、dtrace の出力中で個別の列に表示されます。プローブ名を構成する 4 つの部分は、次のとおりです。

プロバイダ 

このプローブを発行した DTrace プロバイダの名前。プロバイダ名は、通常、プローブを有効にする計測機能を実行する DTrace カーネルモジュールの名前と一致しています。 

モジュール 

プローブが置かれているモジュールの名前 (このプローブが特定のプログラムの場所である場合)。この名前は、カーネルモジュール名またはユーザーライブラリ名です。 

機能 

プローブが置かれているプログラム関数の名前 (このプローブが特定のプログラムの場所である場合)。 

名前 

BEGINEND のように、プローブの機能を連想しやすい名前。プローブ名の最後の部分です。

人間が読める形式のプローブ名を完全な形で記述するときは、4 つの部分をコロンで区切ります。

provider:module: function:name

一覧に表示されるプローブの中には、先ほど使用した BEGINEND のように、モジュールと関数を持たないものもあります。これらのプローブは、特定の計測機能付きプログラムの関数や場所を表すものではないので、モジュールのフィールドと関数のフィールドが空欄になっています。これらのプローブは、「トレース要求の終了」など、より抽象度の高い概念を表しています。名前の構成要素としてモジュール名と関数名を持つプローブを「アンカーされたプローブ」、これらの名前を持たないプローブを「アンカーされていないプローブ」と呼びます。

要求時にプローブ名の一部を省略して指定した場合、DTrace は通常、指定された名前と一致する値を持つすべてのプローブを検出します。たとえば、BEGIN と指定した場合、DTrace は、プロバイダフィールド、モジュールフィールド、関数フィールドの値とは関係なく、BEGIN という名前フィールドを持つプローブをすべて検出します。上記の例では、たまたま一致する文字列を持つプローブが 1 個しかなかったため、同じ結果になりました。BEGIN プローブの正式な名前は dtrace:::BEGIN です。この名前が示すように、このプローブは DTrace フレームワーク自体から提供され、関数にアンカーされていません。したがって、hello.d プログラムは、次のように書き換えることができます。結果は、上記の例と同じです。

dtrace:::BEGIN
{
	trace("hello, world");
	exit(0);
}

これで、プローブの提供元と、プローブの指定方法がわかりました。以下では、プローブを有効にし、DTrace に何らかの処理を指示したときの様子について少し詳しく見ていきます。その後、D プログラミング言語の解説に戻ります。