heads-up
Rui Paulo氏が開発を進めてきたユーザランドDTraceの機能が9-CURRENTにマージされました。2010年9月26日以降の9-CURRENTで利用できます。安定版ブランチではFreeBSD 8.2および7.4で登場することになる見通しです。FreeBSDは7.0からDTraceをサポートしていますが、これまでサポートしていたのはカーネルにおけるDTraceでした。今回ユーザランドDTraceが導入されたことで、プロセスを指定して内部の動作を詳しく調査することが可能になります。
DTraceを利用するには、次の設定をカーネルオプションファイルに追加してカーネルを再構築する必要があります。i386を使っている場合にはKDTRACE_FRAMEは不要です。amd64を使ってる場合にはKDTRACE_FRAMEが必要になります。
DTraceに対応したカーネルを起動したら、kldload(8)でdtraceallカーネルモジュールを読み込ませます。
以後、ユーザランドDTraceの機能を利用できます。ユーザランドDTraceの動作を手っ取り早く確認するにはdtruss(1)コマンドが便利です。これは指定されたプロセスやコマンドのシステムコールやユーザランドスタックの動きをトレースして表示するというものです。
D言語を使ってユーザランドアプリケーションのどの動作をトレースするかを示した簡単なサンプルがDTrace - FreeBSD Wikiに掲載されています。次のような1秒スリープを繰り返すプログラムをトレースするというものです。ここではsleep-loopとしてコンパイルしておきます。
main関数とsleep関数に入った段階でその旨を出力するスクリプトを書きます。
この2つを指定してdtrace(1m)を実行すると、sleep-loopの動作から指定された内容をトレースして次のように出力されます。
ユーザランドDTraceが使えるようになると大規模で複雑なアプリケーションのデバッグや性能改善などの作業が従来よりも取り組みやすくなります。Ports CollectionのMySQLとPostgreSQLはすでにDTraceに対応したビルドをするためのオプションが取り込まれています。ユーザランドDTraceはアプリケーションやユーティリティの移植作業におけるツールとしても有益です。