SystemTap用のemacsメジャーモードを書いてみた

tokyo-emacsustreamで眺めていてElispが書いてみたくなり、SystemTapスクリプトを編集&ついでに実行できるメジャーモードを書いてみました。
これを使うと、EmacsからホストのLinuxカーネルをHackして、いろんな情報をとったりできます。


書いたものは本エントリの最後に。CodeRepos に入れて共有すると良さげだけど、commit権もってない…。id:Yappoにお願いすれば良いのだろうか。

2008-07-26 追記

CodeReposにアップしました。閲覧 & ダウンロード


ろくに数行以上のElispを書いたことも無いくせに、いきなりメジャーモードに挑戦するとか無謀すぎな気もしますが、気にしない気にしない。

実現したいこと:

  • SystemTapスクリプトショートカットで実行開始/停止して結果が確認できる
  • ついでに上記に対応して専用メニューとかもつけてみる
  • 適当にインデントしてくれる
  • 色付け(font-lock対応)

一番上が最もやりたくて、あとは"メジャーモードらしさ"として必要かなーという感じ。

方針

SystemTapスクリプトAwkライクな言語ということになっています。文末にセミコロンが要らないとか。現在のところ、Awkのモードはcc-modeの派生モードとして実現されているようです。そこで、これをさらに派生させて実現してみることにします。
cc-modeはそこそこ強力な構文解析エンジンみたいなものを提供してくれるので、これを使えば比較的楽にfont-lockや自動インデントに対応できるんじゃないかという目論みです。

幸い、cc-modeを派生させる例が http:/cc-mode.sourceforge.net/derived-mode-ex.el に用意されているので、これを真似して書いてみます。

使い方

emacs 22、cc-mode 5.3以降が必要なんだと思います。多分。Fedora 9ならOKっぽい。
本エントリの最後にあるsystemtap-mode.elをload-pathの通った場所にいれて、.emacs

  (autoload 'systemtap-mode "systemtap-mode")
  (add-to-list 'auto-mode-alist '("\\.stp\\'" . systemtap-mode))

とか書けば良いと思います、多分。ちなみにload-pathを ~/.elisp というディレクトリに通したい場合、

(setq load-path (cons "~/.elisp" load-path))

.emacsの先頭あたりに書いておけばOKです。


で、emacsをroot権限で動かしておいて(sudo emacsとして起動するとか。emacsのbufferからsudoでパスワード受け付ける方法が分からない)、

probe kernel.function("schedule").return {
    log(execname())
}

とか書いてファイルに保存し、C-c e をタイプすれば、プロセスの切り替わるたびに、切り替わったプロセス名が別バッファに表示されていきます。
これだとものすごい勢いでメッセージがバッファに追記されてしまうので、止めるには C-c c をタイプすればOK。
10000回くらいでexit()するようにした方が良いでしょうね。。


ちなみにFedora 9でSystemTapを使うには、事前に

# yum install systemtap kernel-devel
# debuginfo-install kernel

くらいが必要です。


以下、systemtap-mode.elの中身について。

続きを読む