2009/11/23

再起動せずにUbuntu 8.04 LTSでsystemtapを使う

systemtapは実行中のkernel内部の情報を取るためのユーティリティです。 RHELでの使い方はSystemTapによるライブカーネルプローブにさらっと載っています。

UbuntuというかDebianでは、debuginfoを含んだ"linux-image-debug-$(uname -r)"パッケージの中にはモジュールについてのデバッグ情報は含まれていません。 そのせいか解説しているWebサイトでは、いきなり"make menuconfig"を実行してカーネルのリコンパイルから説明しているものがあります。

カーネルが実行しているシステムコールだけを知りたかったので、debパッケージをそのまま使うことにしました。

systemtapを導入してもhelloworld.stp以外が動かない

導入するパッケージは2つです。

$ sudo apt-get install linux-image-debug-$(uname -r) linux-headers-$(uname -r)
$ sudo apt-get install systemtap

"$(uname -r)"は”uname -r"部分を実行した結果の文字列"2.6.24-25-generic"に置き換えられて、いま実行しているカーネルのバージョンに応じたデバッグイメージを取り込みます。 もしカーネルが更新されても常にデバッグイメージを最新にしたい場合には"linux-image-debug-generic"等を指定すると良いでしょう。

この状態で"/usr/share/doc/systemtap/examples"以下にあるプログラムを実行してみても、helloworld.stpを除くと実行に失敗するものがあります。

$ sudo stap /usr/share/doc/systemtap/examples/iotime.stp
semantic error: libdwfl failure (missing kernel debuginfo): No such file or directory while resolving probe point kernel.function("sys_open")?

何が悪いのか調べるために"strace"コマンドを使いました。

$ sudo strace stap /usr/share/doc/systemtap/examples/iotime.stp
...
open("/boot/.debug/vmlinux-2.6.24-25-server", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/debug/boot/vmlinux-2.6.24-25-server", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/boot/vmlinux-2.6.24-25-server.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
...

いろいろな場所にあるデバッグイメージを探しに行きますが、見つけられないようです。 導入したdebパッケージ名から、どこにイメージがインストールされているか確認します。

$ dpkg -L linux-image-debug-2.6.24-25-server
/.
/boot
/boot/vmlinux-debug-2.6.24-25-server
...

微妙に名前が違うんですよね。まぁ安易にデバッグ情報にアクセスできるのも考えものなのかなぁ。 どこに置くべきか迷ったのですが、/boot/.debugを作成してリンクを張る事にしました。

$ sudo mkdir /boot/.debug
$ cd /boot/.debug
$ sudo ln -s ../vmlinux-debug-2.6.24-25-server vmlinux-2.6.24-25-server

これでsystemtapが使えるようになりました。

0 件のコメント: