エントリー・クラス変数
システム・コールまたはユーザー関数のエントリー・ロケーション・ポイントにあるプローブ・ポイントに関連した節は、プローブされるシステム・コールまたは関数に渡される引数にアクセスできます。
エントリー・ロケーション・ポイントのプローブは、システム・コールとユーザー関数のトレース・プローブ・マネージャーでサポートされます。 例えば、読み取りシステム・コールは、ファイル・ディスクリプター ID、ユーザー・バッファーに対するポインター、および読み取るデータのバイト数の値の 3 つの引数を取ります。 これらの 3 つの引数の値にアクセスできるのは、プローブ指定が読み取りシステム・コールのエントリー・ポイントのプローブを指定する @@syscall:*:read:entry である場合です。
@@syscall:*:read:entry,@@syscall:*:write:entry
{
char *argument;
argument=__arg2; -> Not Allowed.
}Probevue は次のエラー・メッセージを表示して終了します: arg builtin cannot be used. (arg 組み込み変数は使用できません) No defined function. (定義されている関数はありません)Vue 節での入り口クラス変数の使用は、プローブされる関数の C スタイルの宣言、特に関数に渡されるパラメーターのデータ型が Vue スクリプトにも指定されている場合にのみ有効です。 これは、入り口節を参照する最初の Vue 節の前にテキストとして指定する必要があります。 宣言は、 Vue スクリプトの最上部にある Vue 節の前にテキストとして配置します。
次のスクリプトの例では、エントリー・クラス変数を使用しています。
int read(int fd, char *buf, unsigned long size);
@@syscall:*:read:entry
{
printf("Number of bytes to read = %d\n", __arg3);
}
2 つ目の要件は、節に関連したプローブ指定が固有のプローブ・ポイントを識別するということです。 プローブ指定で複数のプローブ・ポイントが指定されている Vue 節では、プローブされる関数が同じであるか、類似した関数プロトタイプを持っているかに関係なく、エントリー・クラス変数を使用することはできません。 以下のスクリプトは正しくないスクリプトであり、プローブ指定に 2 つのプローブ・ポイントが含まれているため、 ProbeVue コンパイラーは構文エラーで失敗します。
int read(int fd, char *buf, unsigned long size);
int write(int fd, char *buf, unsigned long size);
@@syscall:*:read:entry, @@syscall:*:write:entry
{
/* Cannot use __arg3 in here, as this clause has multiple probe
* points associated with it. This script will fail with a
* syntax error in the compilation phase of the probevue command.
*/
printf("Number of bytes to read/write = %d\n", __arg3);
}
次のように変更されたスクリプトは機能します。
int read(int fd, char *buf, unsigned long size);
int write(int fd, char *buf, unsigned long size);
@@syscall:*:read:entry
{
printf("Number of bytes to read = %d\n", __arg3);
}
@@syscall:*:write:entry
{
printf("Number of bytes to write = %d\n", __arg3);
}