川の流れのように‥(Eiji Ota's Weblog)

木曜日 5 12, 2005

DTrace (Solaris Dynamic Tracing) - powerful tracer on Solaris10

皆さん、DTrace (Solaris Dynamic Tracing)ってご存知ですか? Solaris10で導入されたトレース機能です。これって本当に便利なんですよ。 カーネルのデバックでもかなり活躍します。欠点といえば、ソースがないとフックする関数であるとか、引数であるとか分かりにくい(ヘッダーファイルをみればある程度想像できますけど)こととかですが、これはあのOpenSolarisがリリースされれば、解決しますね! ^-^ DTraceにはanonymous tracingというのがあって、カーネルブート中にも自動でDTraceを起動して、問題を追跡することができます。この前のテストの時に、とあるカーネルモジュールからワーニングが出るようになって、それが僕の修正のせいなのかどうか、調べる必要がでてきました。 そこで、このanonymous tracingの出動ですよ、皆さん! 方法は至って簡単。 まずは追跡するモジュール名を調べます。ここではhogeとしましょうね。 そしたら、次のコマンドをスーパーユーザで実行するだけ。 # dtrace -A -m hoge そうすると、dtraceがフックを貼ったことを教えるメッセージがドワーと出ますので、取りあえず無視。そして、rebootです。 # reboot そうすると、次のブートの時にdtraceが起動されて、動いたことを示すメッセージがブート中に出ます。それを見てよしよしと納得しましょう。うまく行っている証拠。^o^ 起動したら、dtraceを叩いて、早速ログを拝見。 # dtrace -a このログを見て更に絞り込み。例えば、hogeモジュールのhogehoge関数が怪しいと睨めば、次のような簡単なスクリプトを作るだけ。 hoge.d fbt::hogehoge:entry { self->trace = 1; } fbt::: /self->trace/ { } fbt::hogehoge:return { self->trace = 0; } これは、hogehoge関数が呼び出されたら、トレースをスタートさせ、呼び出しが終了したらトレースを停止させるというものです。簡単だぁ。 これを作ったのはBryan Cantrillさんです。もう感謝、感謝。謝謝の世界ですね。 で、僕も早速やってみました。ところが‥、何もトレースがとれないではありませんかっ! 何でぇ‥と調べてみると、ブート時にプラットフォーム依存で呼び出されるモジュールで、dtraceモジュールより先にロードされてしまっていました。僕の調べたかったのは、そのモジュールのattachルーチンなので、ロードされる時に呼び出されてしまうのですよね。^.^; dtraceモジュールは/etc/systemでforceloadされているんですけど、ブート時に必要な幾つかのモジュールはそれより先にロードされてしまうのがあるんです。トラブルのものはそんな内の1つでした。あぁぁぁ。 結局、kmdbを起動。昔ながらのkernelデバッカを使用して調査です。。。寂しい。 ちなみにkmdbは、Solaris9で提供されていたmdbのカーネル用です。従来のkadbの置き換えなんですが、こっちも相当に便利っ! でも、そのお話はまた別の機会に。。。 えっ、調査結果? 結局、ワーニングは僕の修正とは関係がないことが分かりました。 めでたし、めでたし‥かな? おっと、最後にanonymous tracingを止める方法を。これはマニュアルにも載っていなかったので、調べるのにちょっと時間がかかりました。^-^; # dtrace -A って実行するだけです。これでフックが全部外れて、ブート時のトレースを停止します。これもシンプルですね。

Comments:

Hello, Eiji-san. My wife translated your blog for me :). I'm collecting Solaris blogs for the OpenSolaris launch (http://blogs.sun.com/roller/page/jimgris/20050413#solaris_blog_hunting), so I'd like to link to you in my blog roll as well. Thanks ... Jim

Posted by Jim Grisanzio on 5月 12, 2005 at 05:43 午後 PDT #

Post a Comment:
  • HTML Syntax: NOT allowed

Calendar

Feeds

Search

Links

Navigation

Referrers