プログラミングユーティリティ

プローブポイントの挿入

以下のような場合に、プローブポイントをコードに挿入します。

TNF_PROBE マクロの使い方

単純な例として、TNF_PROBE_0 を以下に示します。このマクロには、引数の型は指定しません。

TNF_PROBE_0 (name, keys, detail);

各変数について説明します。

上記のコマンドで照合される値を表 1-8 に示します。

表 1-8 ユーザー定義属性の例

属性 

値 

prex が照合する値

sunw%debug

entering function A

entering または function または A

comX%exception

no file

no または file

comY%func_entry

 

/.*/ (正規表現)

comY%color

red blue

red または blue

libtnfprobe は、ベンダー記号が前に付いていない属性名をすべて予約します (つまり、名前に % 記号が含まれていない属性をすべて予約します)。「C プログラムのサンプル」cookie.c では、以下の TNF_PROBE_0 を使用しています。

TNF_PROBE_0(start, "cookie main", "sunw%debug starting main");

注 -

プリプロセッサオプションの -DNPROBE (cc(1) のマニュアルページを参照) を使用してコンパイルする場合、またはプリプロセッサ制御文 #include <tnf/probe.h> の前に #define NPROBE を置いてコンパイルする場合には、プローブポイントと TNF の型拡張コードがプログラムにコンパイルされないようにしてください。


TNF_PROBE_1TNF_PROBE_5

引数の名前に含まれている数字 1 〜 5 は、プローブポイントに指定する変数の数を表します。たとえば、TNF_PROBE_1 の構文は次のようになっています。

TNF_PROBE_1(name, keys, detail,
arg_type_1, arg_name_1, arg_value_1);

また、TNF_PROBE_5 の構文は次のようになっています。

TNF_PROBE_5(name, keys, detail,
arg_type_1, arg_name_1, arg_value_1
arg_type_2, arg_name_2, arg_value_2
arg_type_3, arg_name_3, arg_value_3
arg_type_4, arg_name_4, arg_value_4
arg_type_5, arg_name_5, arg_value_5);

以下、各引数について説明します。

表 1-9 定義済みの型

型 

対応する C 言語の型と意味 

tnf_long

int、long 

tnf_ulong

unsigned int、unsigned long 

tnf_longlong

long long (コンパイラに実装されている場合) 

tnf_ulonglong

unsigned long long (コンパイラに実装されている場合) 

tnf_float

float 

tnf_double

double 

tnf_string

char * 

tnf_opaque

void * 

たとえば、「C プログラムのサンプル」cookie.c では、以下のように TNF_PROBE_2 を使用しています。

TNF_PROBE_2(inloop, "cookie main loop","sunw%debug in the loop",
            tnf_long, loop_count,   i,
            tnf_long, total_iterations,  sum);

cookie.c のマクロ定義の一部について、表 1-10 で説明します。

表 1-10 cookie.c の TNF マクロ定義

TNF_PROBE_0 ( 

引数の型が指定されていないプローブ 

start, 

プローブの名前 

"cookie main", 

プローブが cookiemain (keys 属性の値) に属しているグループのリスト

"sunw%debug starting main"); 

ユーザー定義の属性 = sunw%debug、値 = starting main (デバッグプローブ関数で使用されます)

TNF_PROBE_2 ( 

2 つの変数を持ったプローブ 

inloop, 

プローブの名前 

"cookie main loop", 

keys - cookie、mainloop

"sunw%debug in the loop", 

デバッグプローブ関数の値 

tnf_long, 

最初の変数の型 

loop_count, 

最初の変数の名前 (slots 属性の値)

i, 

最初の変数 

tnf_long, 

2 番目の変数の型 

total_iterations, 

2 番目の変数の名前 (slots 属性の値)

sum);

2 番目の変数 

""); 

 

例 − 関数の所要時間の測定

例 1-4 では、関数の入口と出口にプローブポイントを配置して、関数内で費やされる時間を測定しています。関数の入口に配置されたプローブは、その関数への引数も記録します。

prex は、トレースが許可されているプローブポイントをプログラム実行時に検出すると、トレースファイルに記録を書き込みます。各プローブポイントは、検出された時刻を記録し、ファイル名、行番号、name、keys などのプローブポイントの詳細情報が含まれたタグ記録を参照します。これらのタグの記録は、トレースファイルに 1 度だけ書き込まれ、上書きされることはありません。

以下のコード例において、最初のプローブポイント work_args は、そのプローブポイントの 2 つの変数値 (statemessage) も記録します。


例 1-4 関数の入口と出口に配置されたプローブポイント

#include <tnf/probe.h>

int
work(int state, char *message)
{
    TNF_PROBE_2(work_start, "work_module work"
               "sunw%debug in function work",
               tnf_long, int_input, state,
               tnf_string, string_input, message);
   ...
    TNF_PROBE_0(work_end, "work_module work", "");
}