これまでの連載における説明では,pid
プロバイダが提供するプローブentry
およびreturn
)
しかし,
そこで,
今回は,
ソースファイルの準備
以下の手順で必要となるソースファイルを準備します。
プロバイダの定義
何をおいても,
リスト1 独自プロバイダの定義
(checkpoint.
)
provider checkpoint {
pass(const char* filename, int lineno);
};
プロバイダcheckpoint
が提供するプローブpass
は,
プログラムの要所要所に埋め込まれたプローブ位置において,ファイル名と行番号情報を採取することで,実行時にどのような経路を通過したのかを知る
つまり,
なおプロバイダ定義を記述する際には,{ }
" の後ろ)
ヘッダファイルの生成
独自プロバイダを定義したならば,dtrace
コマンドを実行してください。
図1 ヘッダファイルの生成
(checkpoint.
)
$ dtrace -s checkpoint.d -h
独自プロバイダを定義したDスクリプトの指定-s
" オプション)-h
" オプションを指定することで,checkpoint.
が生成されます。
リスト2 生成されたヘッダファイルの内容
:
#define CHECKPOINT_PASS(arg0, arg1) \
__dtrace_checkpoint___pass(arg0, arg1)
:
:
extern void __dtrace_checkpoint___pass(char *, int);
:
"-h
"オプション指定によってdtrace
コマンドが生成するヘッダファイルでは,
通常は,
リスト2の例に見られるように,__
)
ユーティリティヘッダの定義
先述したように,dtrace
コマンドによって生成されたヘッダファイルと,pass
のようなプローブの場合,checkpoint_
を定義しましょう。
リスト3 ユーティリティヘッダの作成
(checkpoint_
)
#include "checkpoint.h"
#define DTRACE_CHECKPOINT_PASS() \
CHECKPOINT_PASS(__FILE__, __LINE__)
CHECKPOINT_
マクロを直接使用するのではなく,DTRACE_
マクロを使うことで,
Cプログラムの実装
今回独自に定義したpass
プローブの埋め込み対象として,main()
に持つプログラムを想定します。
リスト4 プローブ埋め込み対象プログラム
(branch_
)
if(argc < 2){
DTRACE_CHECKPOINT_PASS();
}
else{
int val = atol(argv[1]);
DTRACE_CHECKPOINT_PASS();
if(val < 10){
DTRACE_CHECKPOINT_PASS();
}
else{
DTRACE_CHECKPOINT_PASS();
}
}
DTRACE_CHECKPOINT_PASS();
この実装では与えられた引数に応じて条件分岐を行いますが,pid
プロバイダによる関数フロー採取では,
そこで,pass
プローブを使用することで,