SDTプロバイダ
静的定義トレース(SDT)プロバイダ(sdt
)は、ソフトウェア・プログラマが正式に指定した位置にプローブを作成します。したがって、SDTプロバイダは主に、新しいプロバイダの開発者のにとってのみ関心の対象になります。ほとんどのユーザーは、他のプロバイダを使用して間接的にのみSDTにアクセスします。
プログラマは、SDTメカニズムを使用して、DTraceユーザーにとって重要な位置を意識的に選択し、それぞれの位置のセマンティクス情報をプローブ名によって伝えることができます。
重要な点として、プローブを登録することにより、SDTはメタプロバイダとしても機能します。これにより、io
、proc
、sched
などの他のプロバイダから取得されたように表示することもできます。
プローブの名前の安定性とデータの安定性はどちらも非公開ですが、これはカーネルの実装を反映しており、これらのインタフェースが維持されることを確約するという意味ではありません。
sdtプローブの作成
デバイス・ドライバの開発者であれば、作業中のOracle Linuxドライバ用にsdt
プローブを作成することに関心がある場合があります。SDTの無効化されたプローブの影響は、いくつかのno-operationマシン命令のコストのみになります。したがって、必要に応じてsdt
プローブをデバイス・ドライバ・コードに追加するようにしてください。これらのプローブは、パフォーマンスにマイナスの影響を及ぼすことがないかぎり、出荷コードに残しておくことができます。
DTraceには、アプリケーション開発者がユーザー空間の静的なプローブを定義するためのメカニズムも用意されています。
プローブの宣言
sdt
プローブは、<linux/sdt.h>
のDTRACE_PROBE
マクロを使用して宣言されます。
SDTベースのプローブのモジュール名と関数名は、それぞれプローブのカーネル・モジュール名と関数名に対応しています。DTraceでは、プローブ記述のプローブの識別に使用されるタプルの一部としてカーネル・モジュール名と関数名が含まれているため、プローブ名を考えるときにこの情報を明示的に含める必要はありません。DTraceプログラムでプローブを参照するときにネームスペースの衝突を回避するために、モジュールと関数名を指定することもできます。mymoduleがインストールしたプローブと、DTraceユーザーに表示されるフル・ネームをリストするには、dtrace -l -m mymodule コマンドを使用します。
プローブの名前は、DTRACE_PROBE
マクロに指定された名前に依存します。その名前に連続する2つのアンダースコア(__
)が含まれていない場合、プローブの名前はマクロに記述されたとおりです。名前に連続する2つのアンダースコアが含まれている場合、プローブ名では連続するアンダースコアが単一のダッシュ(-
)に変換されます。たとえば、DTRACE_PROBE
マクロでtransaction__start
が指定されている場合、SDTプローブはtransaction-start
という名前になります。この置換により、有効なC識別子ではないマクロ名を文字列を指定せずにCコードで指定できます。
また、SDTはメタプロバイダとしても機能し、プローブを登録することにより、独自の専用モジュールを持たないio
、proc
およびsched
などの他のプロバイダからのプローブのように表示することもできます。たとえば、kernel/exit.c
には、<linux/sdt.h>
に次のように定義されている、DTRACE_PROC
マクロのコールが含まれています。
# define DTRACE_PROC(name) \
DTRACE_PROBE(__proc_##name);
このようなマクロを使用するプローブは、sdt
以外のプロバイダからのプローブのように表示されます。name
引数に含まれる先頭の2つのアンダースコア、プロバイダ名および末尾のアンダースコアは、プロバイダを一致させるために使用され、プローブ名には含まれません。