dbx は、RTC が親プロセスで有効であり、dbxenv 変数 follow_fork_mode が child に設定されている場合、子プロセスの実行時検査をサポートします。フォークが起こると、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 のシンボル情報を読んでいます (dbx) check -all アクセス検査 - ON メモリー使用状況検査 - ON (dbx) dbxenv follow_fork_mode child (dbx) run 実行中: program1 (プロセス id 10710) 実行時検査を有効にしています...終了 (注 1) 非初期化領域からの読み取り (rui): 4 バイト読み取り を アドレス 0xeffff110 で しようとしました それは 104 バイト 現スタックポインタより上 です 変数は 'parent_j' です。 現関数 :main 11 parent_i = parent_j;
注 1: RTC は親プロセス、program1 の最初のエラーを報告します。
(dbx) cont dbx: 警告: フォークしました。親プロセス内での実行時検査機能は休止します (注 2) プロセス 10710 から切り離し中< parent: child's pid = 10711 プロセス 10711 に接続しました。 _libc_fork で停止しました アドレス 0xef6b6f78 0xef6b6f78: _libc_fork+0x0008: bgeu _libc_fork+0x30 現関数 :main< 13 child_pid = fork(); (dbx) cont child: In child (注 3) 非初期化領域からの読み取り (rui): 4 バイト読み取り を アドレス 0xeffff7c0 で しようとしました それは 96 バイト 現スタックポインタより上 です 変数は 'child_j' です。 現関数 :main 22 child_i = child_j; (dbx) cont dbx: プロセス 10711 は exec("./program2") をするところです (注 4:) dbx: プログラム "./program2" が今 exec されました dbx: オリジナルプログラムに戻るには "debug $oprog" を使用します program2 のシンボル情報を読んでいます すでに読んでいるので、ld.so.1 を飛ばします すでに読んでいるので、librtc.so を飛ばします すでに読んでいるので、libc.so.1 を飛ばします すでに読んでいるので、libdl.so.1 を飛ばします 実行時検査を有効にしています...終了 main で停止しました 行番号 8 ファイル "program2.c" 8 printf("program2: pid = %d¥n", getpid()); (dbx) cont program2: pid = 10711
注 2: follow_fork_mode が child に設定されているため、フォークが起こると、エラー検査が親プロセスから子プロセスに切り替えられます。
注 3: RTC は子プロセスのエラーを報告します。
注 4: program2 の実行が起こると、RTC 設定値は program2 から継承されるため、アクセスおよびメモリー使用状況の検査がそのプロセスに対して有効になります。
非初期化領域からの読み取り (rui): 4 バイト読み取り を アドレス 0xeffff7fc で しようとしました それは 100 バイト 現スタックポインタより上 です 変数は 'program2_j' です。 現関数 :main 9 program2_i = program2_j; (dbx) cont メモリーリーク検査中... 実際のリークの報告 (実際のリーク: 1 合計サイズ: 8 バイト) 合計 ブロック リーク 割り当て呼出しスタック サイズ 数 ブロック アドレス ====== ======== ========== ============================ 8 1 0x20c50 main 起こり得るリークの報告 (起こり得るリーク: 0 合計サイズ: 0 バイト) 実行完了。終了コードは、0 です
注 5: RTC は、実行されたプログラム、program2 のアクセスエラーを報告します。
注 6: RTC は、RTC 制御下にある間に終了したプロセス、program2 に関するメモリー使用状況レポートとメモリーリークレポートを出力します。