Sun Studio 12: dbx コマンドによるデバッグ

子プロセスにおける RTC の実行

子プロセスで RTC を実行するには、dbx 環境変数 rtc_inheriton に設定します。デフォルトでは 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 です。