#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行の配列への代入でエラーが出た、ということが 分かります。