子プロセスで RTC を実行するには、dbx 環境変数 rtc_inherit を on に設定します。デフォルトでは off になります (「dbx 環境変数の設定」を参照)。
親で RTC が有効になっていて、dbx 環境変数 follow_fork_mode が child に設定されているときに dbx を実行すると子プロセスの RTC を実行できます (「dbx 環境変数の設定」を参照)。
分岐が発生すると、dbx は子に RTC を自動的に実行します。プログラムが exec() を呼び出すと、exec() を呼び出すプログラムの RTC 設定がそのプログラムに渡ります。
特定の時間に RTC の制御下におくことができるプロセスは 1 つだけです。次に例を示します。
% cat -n program1.c
1 #include <sys/types.h>
2 #include <unistd.h>
3 #include <stdio.h>
4
5 int
6 main()
7 {
8 pid_t child_pid;
9 int parent_i, parent_j;
10
11 parent_i = parent_j;
12
13 child_pid = fork();
14
15 if (child_pid == -1) {
16 printf("parent: Fork failed\n");
17 return 1;
18 } else if (child_pid == 0) {
19 int child_i, child_j;
20
21 printf("child: In child\n");
22 child_i = child_j;
23 if (execl("./program2", NULL) == -1) {
24 printf("child: exec of program2 failed\n");
25 exit(1);
26 }
27 } else {
28 printf("parent: child's pid = %d\n", child_pid);
29 }
30 return 0;
31 }
|
% cat -n program2.c
1
2 #include <stdio.h>
3
4 main()
5 {
6 int program2_i, program2_j;
7
8 printf ("program2: pid = %d\n", getpid());
9 program2_i = program2_j;
10
11 malloc(8);
12
13 return 0;
14 }
%
|
% cc -g -o program1 program1.c
% cc -g -o program2 program2.c
% dbx -C program1
program1 のシンボル情報を読んでいます
rtld /usr/lib/ld.so.1 のシンボル情報を読んでいます
librtc.so のシンボル情報を読んでいます
libc.so.1 のシンボル情報を読んでいます
libdl.so.1 のシンボル情報を読んでいます
libc_psr.so.1 のシンボル情報を読んでいます
(dbx) check -all
アクセス検査 - ON
メモリー使用状況検査 - ON
(dbx) dbxenv follow_fork_mode child
(dbx) run
実行中: program1
(プロセス id 3885)
実行時検査を有効にしています...done
RTC は親プロセス、program1 の最初のエラーを報告します。
非初期化領域からの読み取り (rui):
4 バイト読み取りをアドレス 0xeffff110 でしようとしました
それは 104 バイト現スタックポインタより上です
変数は 'parent_j' です。
現関数: main
11 parent_i = parent_j;
(dbx) cont
dbx 警告: フォークしました。親プロセス内での実行時検査機能は休止します
プロセス 3885 から切り離し中
プロセス 3886 に接続しました。
follow_fork_mode が child に設定されているため、フォークが起こると、エ
ラー検査が親プロセスから子プロセスに切り替えられます。
_libc_fork で停止しました アドレス 0xef6b6040
0xef6b6040: _fork+0x0008:bgeu _fork+0x30
現関数: main
13 child_pid = fork();
親: child's pid = 3886
(dbx) cont
子: In child
非初期化領域からの読み取り (rui):
4 バイト読み取りをアドレス 0xeffff108 でしようとしました
それは 96 バイト現スタックポインタより上です
RTC は子プロセスのエラーを報告します。
変数は 'child_j' です。
現関数: main
22 child_i = child_j;
(dbx) cont
dbx: プロセス 3886 は exec("./program2") をするところです
dbx: プログラム "./program2" が今 exec されました
dbx: オリジナルプログラムに戻るには "debug $oprog" を使用します
program2 のシンボル情報を読んでいます
すでに読んでいるので、ld.so.1 を飛ばします
すでに読んでいるので、librtc.so を飛ばします
すでに読んでいるので、libc.so.1 を飛ばします
すでに読んでいるので、libdl.so.1 を飛ばします
すでに読んでいるので、libc_psr.so.1 を飛ばします
program2 の実行が起こると、RTC 設定値は program2 から継承されるため、ア
クセスおよびメモリー使用状況の検査がそのプロセスに対して有効になります。
実行時検査を有効にしています...done
main で停止しました 行番号 8 ファイル "program2.c"
8 printf ("program2: pid = %d\n", getpid());
(dbx) cont
program2: pid = 3886
非初期化領域からの読み取り (rui):
4 バイト読み取りをアドレス 0xeffff13c でしようとしました
それは 100 バイト現スタックポインタより上です
RTC は、実行されたプログラム、program2 のアクセスエラーを報告します。
変数は 'program2_j' です。
現関数: main
9 program2_i = program2_j;
(dbx) cont
メモリーリーク検査中...
RTC は、RTC 制御下にある間に終了したプロセス、program2 に関するメモリー使
用状況レポートとメモリーリークレポートを出力します。
実際のリークの報告 (実際のリーク: 1 合計サイズ: 8 バイト)
合計 ブロック リーク 割り当て呼び出しスタック
サイズ 数 ブロック
アドレス
========== ====== ========== ====================================
8 1 0x20c50 main
起こり得るリークの報告 (起こり得るリーク: 0 合計サイズ: 0 バイト)
実行完了。終了コードは 0 です。
|