エントリー・クラス変数

システム・コールまたはユーザー関数のエントリー・ロケーション・ポイントにあるプローブ・ポイントに関連した節は、プローブされるシステム・コールまたは関数に渡される引数にアクセスできます。

エントリー・ロケーション・ポイントのプローブは、システム・コールとユーザー関数のトレース・プローブ・マネージャーでサポートされます。 例えば、読み取りシステム・コールは、ファイル・ディスクリプター ID、ユーザー・バッファーに対するポインター、および読み取るデータのバイト数の値の 3 つの引数を取ります。 これらの 3 つの引数の値にアクセスできるのは、プローブ指定が読み取りシステム・コールのエントリー・ポイントのプローブを指定する @@syscall:*:read:entry である場合です。

関数へのパラメーターは、特殊組み込みエントリー・クラス変数名 __arg1__arg2を使用して参照されます。 __arg3、... 関数に渡される引数の数までです。 例えば、読み取りシステム・コールのエントリー・ポイントに関連した節では、__arg1 はファイル・ディスクリプター ID パラメーターの値、__arg2 はバッファー・ポインター・パラメーターの値、および __arg3 は読み取るデータのサイズを示します。
注: 1 つ以上のプローブ・ポイント・タプルが指定されている場合、__arg < x> 変数はアクション・ブロックでは許可されず、以下の例に示すようにエラーになります。
@@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);
	}
注: 上記の例では、スクリプトに指定されている読み取りシステム・コール機能の定義は、 /usr/include/unistd.h ファイルに指定されているものと完全には一致しませんが、同様に機能します。

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);
	}