Indy デバッガ(dbx)の使い方


IRIX Insight の Getting Started With dbx というドキュメントを元に作成しています。


dbx の起動

main.c というファイル名でこういうプログラムをつくったとします。

#include <stdio.h>

void main()
{
    char *dummy;
    int a = 1;

    printf("message1 %d\n", a);
    a++;
    printf("message2 %d\n", a);
    a++;
    printf("message3 %d\n", a);
    a++;
    printf("message4 %d\n", a);
    a++;

    /* segmentation fault !! */
    dummy = (char *)malloc(100);
    dummy[10000] = 'a';
}  
dbxを使うためには cc で -g オプションをつけてコンパイルします。

% cc -g main.c
% ./a.out 
message1 1
message2 2
message3 3
message4 4
Segmentation fault (core dumped)
デバッガは

dbx (実行ファイル名)

で起動です。

% dbx a.out
dbx version 3.19 Nov  3 1994 19:59:46
Executable /dj1/usr1/speech/nishi/src/xpsample/a.out
(dbx)
ちなみに dbx の終了は quit コマンドです。


ソースファイルの検索と表示(list)

まずは main 関数を探して、表示してみよう。

(dbx) list main
>*   4  {
     5      char *dummy;
     6      int a = 1;
     7
     8      printf("message1 %d\n", a);
     9      a++;
    10      printf("message2 %d\n", a);
    11      a++;
    12      printf("message3 %d\n", a);
    13      a++;
(dbx)
つぎは message1 という文字列を探して、表示してみよう。

(dbx) /message1
no match
(dbx) ?message1
   8  printf("message1 %d\n", a);
(dbx) list
>    8      printf("message1 %d\n", a);
     9      a++;
    10      printf("message2 %d\n", a);
    11      a++;
    12      printf("message3 %d\n", a);
    13      a++;
    14      printf("message4 %d\n", a);
    15      a++;
    16
    17      /* segmentation fault !! */
(dbx)
/ は下方向の検索、 ? は上方向の検索です。


ブレークポイントの設定(stop)と実行(run)

9行でプログラムが止まるように設定して、実行してみる。 止まったら a の値を表示してみる。

(dbx) stop at 9
Process     0: [3] stop at "/dj1/usr1/speech/nishi/src/xpsample/main.c":9
(dbx) run
Process  4870 (a.out) started
message1 1
[3] Process  4870 (a.out) stopped at [main:9 ,0x400a3c]
   9  a++;
(dbx) print a
1
(dbx)
a の値がまだ 1 なので、 9行を実行する直前にプログラムが止まったことがわかります。

続きを実行するには cont というコマンドを実行します。

(dbx) cont
message2 2
message3 3
message4 4
Process  4870 (a.out) stopped on signal SIGSEGV: Segmentation violation (default) [main:19 +0x8,0x400af0]
  19  dummy[10000] = 'a';
(dbx)
ふつうに実行してもどこがエラーだか分かりませんが、 dbx で run すると19行の配列への代入でエラーが出た、ということが 分かります。


Takuya NISHIMOTO
Last modified: Tue Jan 7 10:54:58 1997