#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 コマンドです。
>v 1 >/main画面の上半分で
> 3: void main()と表示されたはず。
つぎは message1 という文字列を探して、表示してみよう。
>/message1マルチウィンドウなのでちょっと便利ですね。
>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 = 1a の値がまだ 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行の配列への代入でエラーが出た、ということが 分かります。
s はソースの1行単位でプログラムを実行します。 関数があった場合は、その関数の中も1行単位で実行します。
S (大文字)は s とほぼ同じですが、 関数があった場合は、その関数の呼びだしを1行とみなして実行します。