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

火曜日 5 17, 2005

DTrace (Solaris Dynamic Tracing) - 続き

皆さん、こんにちは。週末は如何でしたか? さて、先日DTraceのanonymous tracingについてお話しましたけれど、hoge.dを作った後、それをどうやってシステムに登録するか、全然説明がなかったですねぇ。(^-^;) 実は、次のように-AFsを指定してdtraceコマンドに食べさせてあげるだけなんです。 # dtrace -AFs hoge.d (hoge.dの登録) これで、自分で作ったDTaceスクリプトがブート時に実行されるってことですね。 解除するには、-Aを指定するだけですよ。 # dtrace -A (hoge.dの解除) このDTraceスクリプト、なにげに便利です。今日はもそっと説明しましょうね。 Unixのlsコマンドって、結構使いますよね。何かあると、無意識に"ls" バッシ!って叩いちゃう。でも、このlsコマンドを実行すると、システムでは何が起きているのだろう‥って時々気になりません? DTraceスクリプトを使うと、簡単に分かっちゃうんですよ。 まず、次のスクリプトを用意してあげます。 #!/usr/sbin/dtrace -s syscall:::entry /execname == "ls"/ { self->traceme++; } syscall:::return /execname == "ls"/ { self->traceme--; } fbt::: /self->traceme/ {} 簡単に説明すると、システムコールが発行されたとき、プログラムが"ls"だったらフラグを立てます。そのシステムコールが終了するときに、フラグを落とすので、"ls"がシステムに要求を出している間はフラグが立っていることになりますね。この処理が最初の2つ、syscall:::entryとsyscall:::returnのところですね。 そして、フラグが立っている間、カーネルの関数をトレースしてやります。それが3つ目のfbt:::のところです。 こんなんで"ls"のために働く関数が全部分かっちゃうわけです。簡単、簡単。 それでは実行してみましょうね。上のファイルをls.dとして保存して、実行権をつけてあげます。 そしてスーパユーザで実行してあげましょう。 # ./ls.d dtrace: script './ls.d' matched 34488 probes dtraceほんちゃら‥ってメッセージがでますけれど、これは無事dtraceが動いている証拠。 そして別のウインドウで"ls"を実行してあげます。 # ls / すると、あら不思議、dtraceを実行したウインドウから次々とカーネルの関数が出力されます。             : 0 1483 page_set_props:entry 0 1484 page_set_props:return 0 1633 page_io_lock:entry 0 1634 page_io_lock:return 0 2642 page_add:entry 0 2643 page_add:return 0 3676 page_add_common:entry 0 3677 page_add_common:return 0 3551 page_create_va:return             : 0 11178 syscall_mstate:entry 0 11179 syscall_mstate:return 0 11178 syscall_mstate:entry 0 11179 syscall_mstate:return 0 11178 syscall_mstate:entry 0 11179 syscall_mstate:return プログラムを停止するには、^Cを叩きます。 0 11179 syscall_mstate:return ^C # でも、こんなにもたくさんの関数が、なにげない"ls"コマンドのために働いていたんですね。 なかなか働き者。よしよしとたまには労ってあげましょうね。^-^ それでは

Comments:

Post a Comment:
  • HTML Syntax: NOT allowed

Calendar

Feeds

Search

Links

Navigation

Referrers