子プロセスで 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 です。 |