GDBの練習#2
さっきやったケースの、今度はデバッグ情報なしでやってみる
$ gcc ./test.c $ ./a.out program start zsh: segmentation fault (core dumped) ./a.out $ gdb ./a.out core.23793 .. (省略) Program terminated with signal 11, Segmentation fault. #0 0x00000000004004f1 in main ()
今度はmain関数内でSignal 11(Segmentation Fault)が出ていることだけは分かった。デバッグ情報なしでもおおまかな関数ではわかるのかな。と思ったので適当にソースを書き換えてみる
test2.c
#include <stdio.h> void myfunc() { int i = 0; int *ptr = &i; ptr += (4 * 1000); *ptr = 777; } int main() { printf("program start\n"); myfunc(); return 0; }
セグメンテーション違反するコードを別の関数に外出ししてそれを呼び出すようにしただけ。
$ gcc test2.c $ ./a.out program start zsh: segmentation fault (core dumped) ./a.out $ gdb ./a.out core.23885 .. (省略) Program terminated with signal 11, Segmentation fault. #0 0x00000000004004e3 in myfunc ()
おお、わかった。関数単位では分かるみたいな感じですね。
おそらくだけど、nmコマンドで出力されるようなtext領域のシンボルは認識出来るみたいな感じかな
$ nm ./a.out| grep ' T ' 0000000000400510 T __libc_csu_fini 0000000000400520 T __libc_csu_init 00000000004005e8 T _fini 0000000000400390 T _init 00000000004003e0 T _start 00000000004004eb T main 00000000004004c4 T myfunc
確認するために試しに./a.outのシンボル情報を消してみて再度gdbを起動してみる
$ strip ./a.out $ gdb ./a.out ./core.24048 Program terminated with signal 11, Segmentation fault. #0 0x00000000004004e3 in ?? ()
おお! 表示されなくなった! やっぱりシンボルとアドレスの対応付けで表示してたんですねぇ。
以上で、coredumpファイルを元に原因を特定するまではシンボル情報があればだいぶ捗るなぁというのがわかった。