Segmentation faultが頻発
非常に不安定なプログラムでSegmentation faultが頻発するような場合、常にそのプログラムをgdb上で動かしてSegmentation faultに備えておくのはどうか。もちろん、デバッグする気がある場合の話だけど。
サンプルプログラムa.cをコンパイルして実行してみる。このサンプルプログラムでは、Segmentation faultが発生するようにバグを埋め込んでいる。
$ cat a.c #include <stdio.h> int main(int argc, char *argv[]) { int i; for (i = 0; i < argc; i++) { printf("%d: <%s>\n", i, argv[i]); } *((int *) NULL) = 123; /* => Segmentation fault */ return 0; } $ gcc -g a.c $ ./a.out a b c 0: <./a.out> 1: <a> 2: <b> 3: <c> zsh: segmentation fault (core dumped) ./a.out a b c
gdb用のスクリプトa.out.xを用意して、gdb上で実行してみる。サンプルプログラムの引数は、a.out.x内に記述する。
$ cat a.out.x run a b c bt $ gdb -q -x a.out.x a.out 0: </tmp/aa/a.out> 1: <a> 2: <b> 3: <c> Program received signal SIGSEGV, Segmentation fault. main (argc=4, argv=0xbfbff584) at a.c:12 12 *((int *) NULL) = 123; /* => Segmentation fault */ #0 main (argc=4, argv=0xbfbff584) at a.c:12 #1 0x08048572 in ___start () 12 *((int *) NULL) = 123; /* => Segmentation fault */ 13 14 return 0; 15 }
と、ここまで書いて思ったけど、別にcoreを解析すればそれで充分な気もしてきた。