サポートされるシェル・エレメント
Vue 言語構文には、エクスポートされたシェル変数や定位置パラメーター (スクリプトの引数) など、 $ 接頭部によって識別されるシェル変数のサポートが含まれています。
Vue シェル変数は、 Vue スクリプト内の任意の場所に指定できます。 これらのシェル変数はプローブの一部として指定され、述部またはアクション・ブロックのステートメント内で使用できます。 ただし、シェル・スクリプトとは異なり、これらの変数は二重引用符付きの文字列内で使用された場合は拡張されません。
コマンド・ラインからスクリプトに渡される引数は、スクリプト内で $1、$2、$3 などとして参照されます。 以下の Vue スクリプトについて考慮してください。
/* Program name: myscript.e */
@@syscall:*:read:entry
when (__pid == $1)
{
int count;
count++;
}
次の例では、myprog プログラムを実行するプロセスのプロセス ID が、前述のスクリプトの $1 と置き換わります。 prgrep シェル・プログラムを使用して Vue スクリプトを呼び出すことを想定しています。このシェル・プログラムは、プロセス名を指定されたプロセス ID を出力します。
probevue myscript.e `prgrep myprog`
シェルからエクスポートされる環境変数は、$ 演算子を使用するスクリプトでも参照されます。 以下の Vue スクリプトについて考慮してください。
/* Program name: myscript2.e */
@@syscall:*:read:entry
when (__pid == $PID)
{
int count;
count++;
}
/* program to be traced has a function called 'foo' */
@@uft:$PID:*:foo:entry
{
printf("Read system call was invoked %d times\n", count);
}
次の例では、3243 が前述のスクリプトの $PID と置き換わります。
PID=3423 probevue myscript2.e
環境変数を ProbeVue スクリプト内のストリングとして認識する必要がある場合、環境変数の値には、ストリングとして識別される囲み二重引用符を含める必要があります。 例えば、次のスクリプトでは、システムで特定のファイルが開かれたときにトレース出力がキャプチャーされます。
/* Program name: stringshell.e */
int open(char *path, int oflag);
@@syscall:*:open:entry
{
String s[40];
s = get_userstring(__arg1, -1);
if (s == $FILE_NAME) {
printf("pid %d (uid %d) opened %s\n",__pid,__uid, s);
exit();
}
}
このスクリプトでは、 $FILE_NAME はエクスポートされたシェル環境変数の名前であると予期しており、 シェル環境変数の値には二重引用符が含まれます。 次にスクリプトの例を示します。
export FILE_NAME=\"/etc/passwd\"
probevue stringshell.e
スクリプトで、値に二重引用符が含まれない、 既存の環境変数の値が必要な場合は、 既存の環境変数を二重引用符で囲んで新しい環境変数を構成する 必要があります。 次にスクリプトの例を示します。
export FILE_NAME=\"$HOME\"
probevue stringshell.e
Vue では、プローブされるプロセスを -X フラグを使用して probevue コマンド自体で開始する場合に役立つ 2 つの特別な環境変数をサポートしています。 $__CPID 環境変数は probevue コマンドで作成された子プロセスのプロセス ID を表し、$__CTID 環境変数はそのスレッド ID を表します。 -X フラグは、特にデバッグ目的で一時的なプロセスをプローブする場合に役立ちます。
Vue スクリプトは、最初の行を以下のスクリプトに設定することにより (シェル・スクリプトと同様に) 直接実行できます。
#!/usr/bin/probevue
probevue コマンドは、シェルのように標準入力から Vue スクリプトを読み取ることもできます。 これを行うには、コマンド・ラインからスクリプトのファイル名を省略します。 これは短いスクリプトをテストする場合に役立ちます。
Vue は、シェルによって内部的に作成される $$ および $@ などの特殊なシェル・パラメーターをサポートしていません。
トレース収集機能
ProbeVue は、包括的なトレース・キャプチャー機能をサポートします。 基本的なトレース収集アクションは、アクション・ブロックの一部としてどのようなプローブからも呼び出し可能な printf 関数を使用して実行されます。 printf 関数の Vue バージョンには、C ライブラリー・バージョンのほとんどの能力が備わっています。 2 つ目のトレース収集関数は trace 関数です。 trace 関数は、パラメーターとして 1 つの変数を受け入れ、その値を印刷可能な 16 進形式でトレース・バッファーにコピーします。 この関数は、特に文字列と構造体の内容をダンプする場合に役立ちます。 stktrace 関数は、現行プローブ・ポイントにあるトレースされたスレッドのスタック・トレースを収集するトレース収集関数です。
内部スクリプト変数の値以外にも、カーネル・グローバル変数のような外部変数、プローブされる関数に対するパラメーターのようなコンテキスト固有データ、関数からの戻り値なども収集でき、これらのトレース収集関数を介して表示できます。
トレース報告プログラムにより、トレース・データが発生時刻順に表示され、異なる CPU から収集されたデータが出力される前に内部でソートされます。