1 DTraceスタート・ガイド
この項の各トピックでは、DTraceで特定の操作を実行する方法のガイダンスを示し、DTraceのインストールと使用の概要について説明します。このガイドのステップに従うことで、すぐにDTraceの使用を開始できます。これらのトピックの確認後に、「DTraceの概念」を確認すると、DTraceのしくみと、その使用方法の改善方法について理解を深めることができます。また、記載されている各種のリファレンスを使用すると、必要な作業を実行するDプログラムの作成の詳細を確認できます。
プローブのリストと有効化
このトピックでは、DTraceで使用可能なプローブをリストして有効にする方法について説明します。
DTraceプロバイダは、DTraceに使用可能なプローブを公開することで、プローブの起動時に関数を実行できるようにします。dtraceコマンドは、使用可能なすべてのプローブのリスト表示や、プローブの有効化に使用できます。
DTraceスクリプトの作成
このチュートリアルでは、DTraceスクリプトの作成方法について説明します。このチュートリアルでは、Dプログラミング言語の理解を深め、DTraceを実際に使用するためのステップを示します。
DTraceがシステムにインストールされていて、プローブのリスト表示と有効化ができることを確認します。「DTraceのインストール」と「プローブのリストと有効化」を参照してください。
このチュートリアルでは、システムについての有用な情報を収集するために使用できるDTraceスクリプトを開発する一連のステップを示します。このチュートリアルは、今後、DTrace用の別のスクリプトを作成するためのフレームワークとして使用できます。
制御フローのための述語の使用
ランタイムの安全性については、Dと他のプログラミング言語(C、C++およびJavaプログラミング言語など)の顕著な違いの1つは、Dでは、if
文やループなどの制御フロー構成が存在しない点にあります。Dプログラム節は、固定量のデータ(オプション)をトレースする単一の直線的な文のリストとして作成されます。Dは、述語と呼ばれる論理式を使用して、条件付きでデータをトレースし、制御フローを変更する機能を提供します。このチュートリアルでは、Dプログラムの制御に述語を使用する方法を示します。
述語の動作を理解するために、10秒カウントダウン・タイマーを実装するDプログラムを作成します。このプログラムを実行すると、10からカウント・ダウンし、メッセージを出力して終了します。このプログラムでは、変数と述語を使用して、経過時間と出力内容を評価します。
このチュートリアルでは、BEGIN
プローブを使用して、変数整数i
をカウントダウン開始の10に初期化します。次に、tick-1sec
プローブを使用して、プログラムに毎秒1回起動するタイマーを実装します。countdown.d
では、tick-1sec
プローブ記述が、述語と関数リストの異なる2つの個別の節で使用されています。述語は、前後をスラッシュ//
で囲まれた論理式で、プローブ名と、節の文リストが入っている中カッコ{}
の間にあります。
最初の述語は、i
がゼロより大きいかどうか(タイマーがまだ実行中かどうか)をテストします。
profile:::tick-1sec
/i > 0/
{
trace(i--);
}
関係演算子>
は、「より大きい」を意味し、偽の場合は整数値0、真の場合は1を返します。i
がまだ0になっていない場合、スクリプトではi
をトレースし、--
演算子を使用して1ずつ値を減らします。
2番目の述語は、==
演算子を使用して、i
が0 (カウントダウンが完了した)の場合に真を返します。
profile:::tick-1sec
/i == 0/
{
trace("blastoff!");
exit(0);
}
2番目の節では、文字列定数と呼ばれる二重引用符で囲まれた一連の文字にtrace
関数を使用して、カウントダウンが完了したときの最後のメッセージを出力します。次に、exit
関数を使用して、すべてのトレースを終了し、最終的なデータの消費、集積体の出力(必要な場合)、シェル・プロンプトに戻る前のクリーン・アップの実行などの残りのタスクを実行します。
例1-1 あるプロセスIDのシステム・コールを監視するために述語を使用する方法
あるプロセスIDのシステム・コールをトレースするDプログラムを作成するには、述語を使用して、トレースするプロセスIDと一致するようにデフォルトのトレース関数を制限します。
syscall:::entry
/pid == 2860/
{
}
この例では、組込み変数pid
と特定のID (この例では2860)の一致が評価されます。さらに、このスクリプトはシェルのマクロ変数を利用するように変更すると、拡張性が向上して、実行時に任意のプロセスIDに対して実行できるようになります。次のようにスクリプトを編集して、strace.ds
というファイルに保存します:
#!/usr/sbin/dtrace -s
syscall:::entry
/pid == $1/
{
}
ファイル・モードを変更して、実行可能にします。
sudo chmod +x strace.ds
これで、このスクリプトを使用して、システムでいずれかのプロセスによって行われたすべてのシステム・コールを監視できます。たとえば、このスクリプトを実行して、cronデーモンによるシステム・コールを監視できます:
sudo ./strace.ds $(pidof /usr/sbin/crond)