HPUX デバッガ(xdb)の使い方


HPUX の xdb デバッガの解説です。


xdb の起動

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';
}  
xdbを使うためには cc で -Aa -g オプションをつけてコンパイルします。

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

xdb (実行ファイル名)

で起動です。

ちなみに xdb の終了は q コマンドです。


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

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

>v 1
>/main
画面の上半分で
>     3: void main()
と表示されたはず。

つぎは message1 という文字列を探して、表示してみよう。

>/message1 
マルチウィンドウなのでちょっと便利ですね。


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

9行でプログラムが止まるように設定して、実行してみる。

>b 9
Overall breakpoints state:  ACTIVE
Added:
 1: count:   1  Active    main: 9: a++;
>
画面の上の方はこんな感じ。
       3: void 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++;
では実行。止ったら a の値を表示してみましょう。
>r
Starting process 15492:  "a.out"
Wait...loading shared-library map tables. Done.
message1 1

breakpoint at 0x00001dc8
>p a
a = 1
a の値がまだ 1 なので、 9行を実行する直前にプログラムが止まったことがわかります。

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

>c
message2 2
message3 3
message4 4

segmentation violation (no ignore) at 0x00001e60
main.c: main: 19 +0x0000000c: dummy[10000] = 'a';
ふつうに実行してもどこがエラーだか分かりませんが、 xdb で run すると19行の配列への代入でエラーが出た、ということが 分かります。


ブレークポイントあれこれ

file.c の 10 行にブレークポイントを設定する
>b file.c:10
ブレークポイントの一覧を表示する
>lb
1 番のブレークポイントを削除する
>db 1

ステップ実行 (s と S)

ソースの1行単位でプログラムを実行することもできます。 新しく作った関数の動作チェックに効果的です。

s はソースの1行単位でプログラムを実行します。 関数があった場合は、その関数の中も1行単位で実行します。

S (大文字)は s とほぼ同じですが、 関数があった場合は、その関数の呼びだしを1行とみなして実行します。


xdb にはとてもたくさんの機能があります。 詳しいことは man xdb で検索してみましょう。日本語で説明を読むことができます。
Takuya NISHIMOTO
Last modified: Sat Jan 25 15:47:36 1997