Solaris 動的トレースガイド

プローブ記述

D プログラム節は、1 つ以上のプローブ記述で始まります。プローブ記述は、通常、以下の形式をとります。

provider:module:function:name

プローブ記述の一部のフィールドを省略した場合、D コンパイラは、指定されたフィールドだけを右から左の順で解釈します。たとえば、foo:bar というプローブ記述は、関数 foo を持つ bar という名前のプローブを表します。プローブのプロバイダとモジュールのフィールドの値は無視されます。このため、プローブ記述は、名前に基づいて 1 つ以上のプローブと照合される「パターン」と見なすことができます。

D プローブ記述を作成するときは、左側に適切な「プロバイダ」を指定できるように、4 つのフィールドの区切り記号をすべて指定してください。プロバイダを指定しないと、複数のプロバイダが同じ名前のプローブを発行している場合に、予想外の結果になる可能性があります。同様に、プローブ記述の一部を省略していると、将来のバージョンの DTrace で追加された新しいプロバイダのプローブが、予期せずして照合されてしまう可能性もあります。プロバイダを指定して、モジュール、関数、名前のフィールドを未指定にした場合、このプロバイダのすべてのプローブが照合されます。たとえば、DTrace の syscall プロバイダから発行されたすべてのプローブを表現するには、syscall::: のように記述します。

プローブ記述では、シェルの「展開」パターンマッチング構文 (sh(1) を参照) とよく似たパターンマッチング構文も使用できます。記述からプローブを照合する前に、DTrace により、各記述フィールドに *?、および [ の文字がないか検査されます。プローブ記述フィールドに、このうちいずれかの文字が含まれていて、その直前の文字が \ でない場合、このフィールドはパターンと見なされます。記述パターンは、プローブの対応するフィールド全体と一致する必要があります。完全な形のプローブ記述では、プローブ記述のすべてのフィールドが一致して初めて、プローブが照合され有効化されます。パターンが使用されていないプローブ記述フィールドは、対応するプローブのフィールドに完全に一致する必要があります。空の記述フィールドは、すべてのプローブを表します。

以下の表に、プローブ名のパターン内で認識される特殊文字を示します。

表 4–1 プローブ名のパターンマッチング文字

記号 

説明 

*

NULL 文字列を含むすべての文字列を表します。 

?

任意の 1 文字を表します。 

[ ... ]

括弧内のいずれか 1 文字を表します。2 つの文字の間に - を入力すると、その範囲 (両端の文字を含む) の任意の文字を表します。[ に続く最初の文字を ! にすると、括弧内に含まれない任意の文字を表します。

\

次の 1 文字に特別な意味を持たせず、文字どおりに解釈します。 

パターンマッチング文字は、プローブ記述の 4 つのフィールド全部、またはそのいずれかで使用できます。dtrace -l とともにコマンド行にパターンを入力して、条件に一致するプローブを一覧することもできます。たとえば、dtrace -l -f kmem_* というコマンドでは、DTrace プローブのうち、関数の名前が kmem_ で始まるものすべてが一覧されます。

複数のプローブ記述または記述パターンで同じ述語とアクションを指定したい場合は、コンマで区切ったリストの形式で記述します。たとえば次の D プログラムでは、「lwp」または「sock」という語を含むシステムコールの開始に関連付けられたプローブが起動するたびに、タイムスタンプがトレースされます。

syscall::*lwp*:entry, syscall::*sock*:entry
{
	trace(timestamp);
}

プローブ記述では、整数のプローブ ID を使って、プローブを指定することもできます。たとえば、次の節を参照してください。

12345
{
	trace(timestamp);
}

この節では、dtrace -l -i 12345 で報告される、プローブ ID 12345 を有効にすることができます。D プログラムを作成するときは、常に、人間が読める形式のプローブ記述を使用する必要があります。整数のプローブ ID は、DTrace プロバイダカーネルモジュールのロード後、アンロード後、または再起動後に変更される可能性があります。