dbx コマンドによるデバッグ

子プロセスでの RTC の使用

dbx は、RTC が親プロセスで有効であり、dbxenv 変数 follow_fork_modechild に設定されている場合、子プロセスの実行時検査をサポートします。フォークが起こると、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_modechild に設定されているため、フォークが起こると、エラー検査が親プロセスから子プロセスに切り替えられます。

注 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 に関するメモリー使用状況レポートとメモリーリークレポートを出力します。