Solaris 動的トレースガイド

マクロ引数

D コンパイラは、マクロ変数のセットも提供します。これらのマクロ変数は、dtrace コマンド呼び出しで指定する引数オペランドに対応しています。これらの「マクロ引数」へのアクセスには、組み込み名を使用します。D プログラムファイル名や dtrace コマンドには $0、最初の追加オペランドには $1、2 番目の追加オペランドには $2 (以下同様) を指定します。dtrace-s オプションを指定した場合、$0 は、このオプションとともに指定する入力ファイルの名前になります。コマンド行に D プログラムを指定した場合は、$0 は、dtrace 自体を実行するとき使用する argv[0] の値になります。

マクロ引数は、そのテキストの形式によって、整数、識別子、または文字列に展開されます。マクロ引数は、すべてのマクロ変数と同じように、D プログラム内の整数、識別子、文字列トークンの代わりに使用できます。以下に示す例はいずれも、適切なマクロ変数を指定すれば、有効な D 式になります。

execname == $1    /* with a string macro argument */
x += $1           /* with an integer macro argument */
trace(x->$1)      /* with an identifier macro argument */

マクロ引数を使って作成した dtrace インタプリタファイルは、実際の Solaris コマンドと同じように機能し、ユーザーやその他のツールによって指定された情報に従って動作を変えます。たとえば次の D インタプリタファイルは、特定のプロセス ID で実行される write(2) システムコールをトレースします。

#!/usr/sbin/dtrace -s

syscall::write:entry
/pid == $1/
{
}

このインタプリタファイルを実行可能ファイルにした場合、コマンド行引数を追加して、$1 の値を指定できます。


# chmod a+rx ./tracewrite
# ./tracewrite 12345

このコマンド呼び出しでは、プロセス ID 12345 で実行される各 write(2) システムコールがカウントされます。

D プログラムが参照するマクロ引数がコマンド行に指定されていない場合は、プログラムを正常にコンパイルすることができず、エラーメッセージが表示されます。


# ./tracewrite
dtrace: failed to compile script ./tracewrite: line 4:
  macro argument $1 is not defined

D プログラムに未知のマクロ引数を参照させたい場合は、defaultargs オプションを指定します。defaultargs オプションを指定した場合、未知の引数の値は 0 になります。D コンパイラオプションの詳細については、第 16 章オプションとチューニング可能パラメータを参照してください。コマンド行に、D プログラムが参照しない引数を指定した場合も、D コンパイラはエラーを返します。

マクロ引数の値は、整数、識別子、または文字列の形式になっていなければなりません。それ以外の形式の場合、D コンパイラはエラーを返します。DTrace インタプリタファイルに文字列形式のマクロ引数を指定するときは、シェルが二重引用符や文字列の内容を解釈しないように、引数をさらに単一引用符で囲みます。


# ./foo '"a string argument"'

D マクロ引数が整数または識別子の形式になっている場合でも、あえて文字列トークンとして解釈したい場合は、マクロ変数またはマクロ引数の名前の前に、ドル記号を 2 つ追加します (例: $$1)。こうすれば、D コンパイラは、引数を「二重引用符で囲まれた文字列」と見なすようになります。通常の D 文字列エスケープシーケンス (表 2–5 を参照) はすべて、文字列形式のマクロ引数の内部で展開されます。これは、$arg$$arg の形式のマクロで参照されている場合でも変わりません。defaultargs オプションが指定されている場合、$$arg の形式で参照される未知の引数の値は、空文字列 ("") になります。