[wiki:SystemTap00 SystemTap メモ #0] の続き。今回は SystemTap Beginners Guide の 3.2. SystemTap Scripts から抜粋。
SystemTap スクリプトのフォーマットはこんな感じ。
probe event { statements }
なので、[wiki:SystemTap00 前回] 出てきた、
$ stap -v -e 'probe vfs.read { printf("read performed\n"); exit() }'
をフォーマットと照らし合わせて読み解くと、「vfs.read イベントが発生したら read performed と表示して exit する」といった意味になる。
{ statements }' の部分は '''handler''' と呼ばれ、'''event''' と それに対応した '''handler''' をあわせて 'probe と呼ぶらしい。
スクリプトの中では関数を定義して呼び出すこともできる。
function function_name(arguments) { statements }
probe event { function_name(arguments) }
イベントは同期イベントと非同期イベントに分かれる。
同期イベントはカーネルコード中の特定の場所で命令が実行された場合に発生するイベント。(非同期イベントは後で説明するが、命令実行とは関係なしに発生するイベント。)
同期イベントには以下のようなものがある。
syscall.''''''systemcall_
systemcall'' というシステムコールの呼び始めに発生するイベント。呼び終わりに発生するイベントは syscall.''systemcall.return 。close システムコールの呼び始めに発生するイベントは syscall.close、呼び終わりに発生するイベントは syscall.close.return 。
vfs.''''''fileoperation_
VFS に対して fileoperation_ の呼び始めに発生するイベント。syscall と同様、 .return を付加すると、呼び終わりイベントとなる。
kernel.function("''''''function''''''")
カーネルファンクション function の呼び始めに発生するイベント。例えば kernel.function("sys_open") は sys_open の呼び始めに発生するイベント。.return がつくと呼び終わりイベント。ワイルドカードとして * がつかえる。また、以下のように特定のソースファイル中のファンクションも指定できる。
probe kernel.function("*@net/socket.c") { }
probe kernel.function("*@net/socket.c").return { }
kernel.trace("''''''tracepoint''''''")
カーネル内の特定のトレースポイントで発生するイベント。例えば、kernel.trace("kfree_skb") だと、カーネル内のネットワークバッファが解放された時にイベントが発生する。
module("''''''module''''''''").function("''''''''function''''''")
モジュール内の特定のファンクションが呼ばれた場合に発生するイベント。
probe module("ext3").function("*") { }
probe module("ext3").function("*").return { }
この例だと、前者は ext3 モジュール内のすべてのファンクションの呼び始めに発生するイベント、後者は呼び終わりに発生するイベント、となる。
非同期イベントはカーネルコード内の命令実行とは無関係に発生するイベント。以下のようなイベントがある。
begin
SystemTap セッションの開始時(SystemTap スクリプトの実行開始時)に発生するイベント。
end
SystemTap セッションの終了時に発生するイベント。
timer events
タイマーイベント。以下の例では4秒ごとにイベントを発生させる。
probe timer.s(4)
{
printf("hello world\n")
}
時間単位は上の例の秒以外にも、以下のように指定できる。
イベントは他にもたくさんあるので、詳しく知りたければ man stapprobes すべし。