Solaris 動的トレースガイド

安定性の計算と報告

D コンパイラは、D プログラム内の個々のプローブ記述とアクション文に対して、安定性の計算を行います。プログラムの安定性のレポートを表示するには、dtrace -v オプションを使用します。以下の例では、コマンド行に記述されたプログラムを使用します。


# dtrace -v -n dtrace:::BEGIN'{exit(0);}'
dtrace: description 'dtrace:::BEGIN' matched 1 probe
Stability data for description dtrace:::BEGIN:
        Minimum probe description attributes
                Identifier Names: Evolving
                Data Semantics:   Evolving
                Dependency Class: Common
        Minimum probe statement attributes
                Identifier Names: Stable
                Data Semantics:   Stable
                Dependency Class: Common
CPU     ID                    FUNCTION:NAME
  0      1                           :BEGIN

プローブを有効にせず、プログラムも実行しないで、プログラムの安定性を判定したい場合は、dtrace -v オプションと -e オプションを組み合わせて使用します。この場合、dtrace は、D プログラムを実行せず、コンパイルだけを行います。以下に、別の安定性レポートの例を示します。


# dtrace -ev -n dtrace:::BEGIN'{trace(curthread->t_procp);}'
Stability data for description dtrace:::BEGIN:
        Minimum probe description attributes
                Identifier Names: Evolving
                Data Semantics:   Evolving
                Dependency Class: Common
        Minimum probe statement attributes
                Identifier Names: Stable
                Data Semantics:   Private
                Dependency Class: Common
#

新しいプログラムでは、D 変数 curthread を参照しています。この D 変数は、安定した名前と非公開のデータセマンティクスを持っています。非公開のデータセマンティクスを持っているということは、この変数について調べるとき、カーネルの非公開の実装の詳細にアクセスするということです。プログラムの安定性レポートには、現在、この状態が反映されています。プログラムレポート内の安定性属性は、インタフェース属性の三つ組の対応する値から最小の安定性レベルとクラスを選択することで計算されます。

プローブ記述の安定性属性は、プロバイダによって発行された属性に従って、指定されたすべてのプローブ記述フィールドの最小の安定性属性をとることによって計算されます。使用可能な DTrace プロバイダの属性については、各プロバイダの章を参照してください。DTrace プロバイダは、自身が公開しているすべてのプローブの 4 つの記述フィールドの 1 つ 1 つに対して、安定性属性の三つ組をエクスポートします。このため、プロバイダの名前のほうが、このプロバイダがエクスポートする個々のプローブよりも安定性が高い場合があります。たとえば、次のようなプローブ記述があるとします。

fbt:::

このプローブ記述は、すべてのカーネル関数の開始 (entry) と終了 (return) をトレースするように指示するもので、次のプローブ記述より高い安定性を備えています。

fbt:foo:bar:entry

このプローブ記述は、カーネルモジュール foo() 内の内部関数 bar を指定しています。簡便性のため、ほとんどのプロバイダは、公開する値 module:function:name 全部に、単一の属性セットを使用します。プロバイダは、args[] 配列の属性を指定します。これは、プローブ引数の安定性がプロバイダごとに異なるからです。

プローブ記述のプロバイダフィールドが未指定の場合、この記述には安定性属性 Unstable/Unstable/Common が割り当てられます。これは、この記述が将来の Solaris バージョンで使用されたとき、現在まだ存在しないプロバイダのプローブと照合されてしまう可能性があるからです。このため、Sun は、このプログラムの将来の安定性と動作について保証できません。D プログラム節を作成するときは、プロバイダを常に明示的に指定する必要があります。また、パターンマッチング文字 (第 4 章D プログラムの構造を参照) や $ 15 のようなマクロ変数 (第 15 章スクリプトの作成を参照) を含むプローブ記述フィールドは、未指定として扱われます。これは、これらの記述パターンを展開すると、将来の DTrace や Solaris OS で、Sun によってリリースされたプロバイダまたはプローブと照合されてしまう可能性があるからです。

ほとんどの D 言語の文で、安定性属性は、その文の構成要素の最小の安定性とクラスをとることで計算されます。たとえば、次の D 言語構成要素は、次の属性を持っています。

構成要素 

属性 

D 組み込み変数 curthread

Stable/Private/Common 

D ユーザー定義変数 x

安定/安定/共通 

次の D プログラム文を作成するとします。

x += curthread->t_pri;

この文の属性は、「Stable/Private/Common」になります。これは、オペランド curthreadx の最小属性です。式の安定性は、各オペランドの最小属性をとることで計算されます。

プログラム内に定義した D 変数には、属性「Stable/Stable/Common」が自動的に割り当てられます。D 言語の文法や D 演算子には、「Stable/Stable/Common」の属性が暗黙的に割り当てられます。逆引用符演算子 (`) によるカーネルシンボルの参照には、常に「Private/Private/Unknown」の属性が割り当てられます。これは、これらが実装アーティファクトを反映しているからです。D プログラムソースコード内で定義した型、具体的に言うと、C 型やD 型の名前空間に関連付けられた型には、「Stable/Stable/Common」の属性が割り当てられます。オペレーティングシステム実装内に定義され、ほかの型の名前空間から提供された型には、「Private/Private/Unknown」の属性が割り当てられます。D 型キャスト演算子が生成する式には、入力式の安定性属性とキャスト出力型の安定性属性との最小値が割り当てられます。

C プリプロセッサを使って C システムヘッダーファイルをインクルードする場合、これらの型には、C 型名前空間が関連付けられ、属性「Stable/Stable/Common」が割り当てられます。これは、D コンパイラが、ユーザーがこれらの宣言に責任を持つと仮定せざるをえないからです。このため、C プリプロセッサを使って実装アーティファクトを含むヘッダーファイルをインクルードする場合、プログラムの安定性を誤る可能性があります。正しい安定性レベルを判断するには、インクルードするヘッダーファイルの文書を常に参照する必要があります。