3.3. 基本的な SystemTap ハンドラーコンストラクト
SystemTap は、ハンドラーでいくつかの基本的なコンストラクトの使用をサポートしています。ほとんどのこれらハンドラーコンストラクトの構文は、C および
awk
構文に基づいています。本セクションでは、SystemTap ハンドラーコンストラクトで最も有用なものをいくつか説明します。これで、簡潔かつ便利な SystemTap スクリプトの作成ができるようになります。
3.3.1. 変数
ハンドラーでは、変数を自由に使うことができます。名前を選択し、関数もしくは式から値を割り当て、式内で値を使用します。SystemTap は、割り当てられた値のタイプに基づいて、自動的に変数が文字列か整数かを識別します。たとえば、変数
foo
を gettimeofday_s()
に (foo = gettimeofday_s()
として) 設定すると、foo
は数字として識別され、printf()
では整数の書式指定子 (%d
) でプリントされます。
ただしデフォルトでは、変数は使用されているプローブのみのローカルとなります。つまり、変数はプローブハンドラーが呼び出されるたびに初期化され、使用され、破棄されます。複数のプローブで変数を共有するには、プローブの外で
global
を使用して変数名を宣言します。以下の例を見てみましょう。
例3.8 timer-jiffies.stp
global count_jiffies, count_ms probe timer.jiffies(100) { count_jiffies ++ } probe timer.ms(100) { count_ms ++ } probe timer.ms(12345) { hz=(1000*count_jiffies) / count_ms printf ("jiffies:ms ratio %d:%d => CONFIG_HZ=%d\n", count_jiffies, count_ms, hz) exit () }
例3.8「timer-jiffies.stp」 では、jiffies およびミリ秒をカウントするタイマーを使用してカーネルの
CONFIG_HZ
設定を計算し、それに応じて計算しています。global
ステートメントにより、スクリプトは変数 count_jiffies
および count_ms
(各プローブで設定) を probe timer.ms(12345)
と共有して使用することができます。
注記
例3.8「timer-jiffies.stp」 の
++
表記 (count_jiffies ++
と count_ms ++
) は、変数の値を 1 増やすために使用されます。以下のプローブで count_jiffies
は、100 jiffies ごとに 1 つ増えます。
probe timer.jiffies(100) { count_jiffies ++ }
この場合、SystemTap は
count_jiffies
が整数であると理解します。count_jiffies
には初期値が割り当てられていないことから、デフォルトでは初期値はゼロになります。