#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 コマンドです。
(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)
/ は下方向の検索、 ? は上方向の検索です。
(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行の配列への代入でエラーが出た、ということが 分かります。