このプログラム cookie.c は give me a COOKIE! というメッセージを表示します。それに対する応答は、大文字で入力する必要があります。小文字の場合は誤りとみなされます。また、数値の素因数を計算することもできます。これら 2 つの処理過程を通して、トレース機能がどのように動作しているかを見てみましょう。
このプログラムをコンパイルして cookie() という実行可能プログラムを作成するには、以下のコマンドを実行します。
$ cc -o cookie cookie.c
このプログラムでは、5 つのプローブポイントが定義 (大文字で表記) されています。各プローブポイントの名前は、start (17 行目)、inloop (33 行目)、factor_start (60 行目)、found_a_factor (65 行目)、factor_end (72 行目)となっています。これらのプローブポイントについての詳細は、「prex セッションのサンプル」で説明しています。
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <tnf/probe.h>
#define MAX_RESPONSE_SIZE 256
static void find_factor(int n);
int
main(int argc, char **argv)
{
boolean_t shouldexit = B_FALSE;
int sum = 0, max_loop = 5;
int i;
TNF_PROBE_0(start, "cookie main",
"sunw%debug starting main");
while (!shouldexit) {
char response[MAX_RESPONSE_SIZE];
int factor_input;
(void) printf("give me a COOKIE! ");
(void) scanf("%s", response);
if (!strcmp(response, "COOKIE")) {
(void) printf("thanks!¥n");
shouldexit = B_TRUE;
}
else if (!strcmp(response, "loop")) {
for (i = 0; i < max_loop; i++) {
TNF_PROBE_2(inloop, "cookie main
loop","sunw%debug in the loop",
tnf_long, loop_count, i,
tnf_long, total_iterations, sum);
sum++;
}
max_loop += 2 ;
}
else if (!strcmp(response, "factor")) {
(void) printf("number you want factored? ");
(void) scanf("%d", &factor_input);
find_factor(factor_input);
}
else {
(void) printf("not a %s, ", response);
}
}
return 0;
} /* end main */
static void
find_factor(int n)
{
int i;
(void) printf("¥tfactors of %d = ", n);
TNF_PROBE_1(factor_start, "factor", "",
tnf_long, input_number, n);
for (i=2; i <= n; i++) {
while (n % i == 0) {
TNF_PROBE_2(found_a_factor, "cookie find_factor",
"", tnf_long, searching_for, n,
tnf_long, factor, i);
(void) printf("%d ", i);
n /= i;
}
}
TNF_PROBE_0(factor_end, "factor", "");
(void) printf("¥n");
}