SDTプロバイダ
静的定義トレース(SDT)プロバイダ(sdt)は、ソフトウェア・プログラマが正式に指定した位置にプローブを作成します。 したがって、SDTプロバイダは主に、新しいプロバイダの開発者のにとってのみ関心の対象になります。 ほとんどのユーザーは、他のプロバイダを使用して間接的にのみSDTにアクセスします。
プログラマは、SDTメカニズムを使用して、DTraceユーザーにとって重要な位置を意識的に選択し、それぞれの位置のセマンティクス情報をプローブ名によって伝えることができます。
重要なことは、SDTがio, lockstat, 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つのアンダースコア、プロバイダ名および末尾のアンダースコアは、プロバイダを一致させるために使用され、プローブ名には含まれません。