C/C++プログラマのためのDTrace入門

第1回 関数フローの採取

この記事を読むのに必要な時間:およそ 5 分

はじめに

DTrace とは

皆さんは DTrace をご存知でしょうか?

DTrace は Sun Microsystems のブライアン・キャントリル(Bryan Cantrill)氏によって開発された,汎用情報採取のフレームワークです。

キャントリル氏へのインタビューでも語られているように,カーネルの動作状況を調査/確認することは,これまで非常に困難な作業でした。

しかし,DTrace の登場により,実際に稼動中のシステムのカーネルからも,安全に(かつ低コストで)情報を採取できるようになりました。

また,DTraceによって解析が容易になったことで,これまで解決することができなかったSolarisカーネルの(潜在的だったものも含めた)実装上の問題も,多数改善することができたのだそうです。

カーネル開発に関わったことがある方ならもちろん,通常のアプリケーション開発であっても,次のような点で苦しめられた経験をお持ちであれば,DTraceが如何に画期的であるかを実感できると思います。

  • リリース用のバイナリで発生するバグが,ログ出力するデバッグ用バイナリだと発生しない
  • デバッグ用バイナリは,実行が遅くて作業が進まない
  • 速度低下が怖くて,稼動中のシステムでは解析用のログ出力を有効にできない
  • 丁度良い量/内容のログを採取するのが難しい

利用可能OSの広がり

DTraceはもちろんSolaris10/OpenSolarisで使用することができます。

さらにこれらSolarisプラットフォーム以外でも,その有用性からDTraceを取り込むOSが増えつつあります。2010年2月時点では,以下のようなOSなどで,DTraceを利用することができます。

利用者の多い Linux では,ライセンス上の問題から残念ながら使用することができないのですが,近年シェア増加の著しいMacOS Xでも使用できますので,ぜひとも多くの方にDTraceの有用性を体感して欲しいところです。

本特集の対象読者

カーネルのパフォーマンスチューニングや,システムトラブルの解析といったカーネルに深く関わる領域で話題となることの多いDTraceですが,実のところユーザプログラムの開発においても非常に有用なツールなのです。

そこでこの連載では,C/C++プログラムの

  • 開発
  • テスト/障害解析
  • 性能チューニング

などに関わる方を対象に,DTrace の利用方法を説明したいと思います。

なお,最近は各種インタプリタやサーバ等にもDTrace対応が盛り込まれるようになりましたので,直接C/C++ での開発を行わない方にとっても,この記事は何がしかの参考になるのではないかと思います。

DTrace Day 2010.03 開催のお知らせ

DTrace Day 2010.03と題したDTraceに関する話題に集中的に取り組む勉強会が,2010年3月27日にOpenSolaris勉強会の主催で開催されます。

筆者も何コマか発表を担当しており,本特集で扱う話題のいくつかは,このイベントで先行的に取り上げる予定です。

「DTraceの事が気にはなっていたけど,始めるきっかけがなかった」方や,⁠もっとDTraceを使い倒したい」方はもちろん,⁠何やら面白そうだ」と興味をそそられた方は,ぜひともご参加ください。

事前準備

本特集での説明を読みながら,実際にDTraceを動かしてみる場合,いくつかの事前準備をしておく必要があります。

ルート権限

繰り返しになりますが,DTraceを使用すれば,現在実行中のカーネルからの情報採取すら可能となります。

その反面,これを悪用しようと思えば,他のユーザが実行しているプロセスから,さまざまな情報を不正に入手することも可能になってしまいます。

そのため,DTrace(実際にはdtraceコマンドによるトレース採取)の実行には,ルート権限が要求されます(※1)⁠

しかし幸いなことに,OpenSolarisやFreeBSD等のOSは無償で入手可能ですし,ハードウェアの低価格化/仮想化の普及も手伝って,自前のDTrace利用環境を構築するのは容易と言っても良いでしょう。

もちろん,大規模なソフトウェアの本格的な開発を行うのであれば,相応の環境が必要となりますが,⁠DTrace がどんなものか試してみたい」程度であれば,環境の調達も難しくないと思われます。

※1)
自分の権限で動作しているプロセスからの情報採取であっても,root権限が必要とされます。

プログラム開発環境

連載後半では,自前のプログラムに対する独自のログ採取機構の埋め込みを扱いますので,C/C++ コンパイラが必要になります。

また,同じコンパイル手順の繰り返しを行う可能性を考えて,makeコマンド等も準備しておきたいところです。

C++プログラマの方へ

本特集は「C/C++ プログラマのための~」と題していますし,DTraceはC++開発にとっても十分有用なツールであるのは確かです。

しかし,DTraceで情報を採取する際に得られる関数名は,C++のソースファイルに記述される形式ではなく,リンカ等のために符号化されたものとなります。

符号化された関数名は,⁠わかる人にはわかる」形式ではあるのですが,決して読みやすい形式ではありませんので,出力された符号化済み関数名を復号化するツールが必要です。

このような用途には,c++filtdemコマンドなどが使用可能(※2)です。

※2)
どちらも SunStudioに含まれていますので,Solarisプラットフォームを使用する場合は,コンパイラの調達も兼ねてSunStudioを利用するのが良いでしょう。

著者プロフィール

藤原克則(ふじわらかつのり)

Mercurial三昧の日々が嵩じて, いつの間にやら『入門Mercurial Linux/Windows対応』を上梓。凝り性なのが災いして,年がら年中アップアップな一介の実装屋。最近は仕事の縁が元で,OpenSolarisに入れ込む毎日。

コメント

コメントの記入