キモブロ

Please spy check please, Fucking retard

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ファイルを元に原因を特定するまではシンボル情報があればだいぶ捗るなぁというのがわかった。