キモブロ

Please spy check please, Fucking retard

GDBの練習#1

GDBがいろいろ必要な雰囲気になったので勉強することにした。まず簡単なケースから練習していく。コツコツ勉強。まずは可能な限り人間にやさしいケースを学びたかったので、自分でエラーの起きるコード書いて、エラーの原因を探ってみる。
test.c

#include <stdio.h>

int main()
{
  printf("program start\n");

  int i = 0;
  int *ptr = &i;
  ptr += (4 * 1000); // むちゃくちゃ適当なメモリアドレスを参照し
  *ptr = 777; // そこに値を代入しちゃう
  return 0;
}

これを実行すると

$ gcc ./test.c
$ ./a.out
program start
zsh: segmentation fault (core dumped)  ./a.out

そして、カレントディレクトリには、core.23464というファイルが生成された。このままコアダンプファイルをgdbに読み込ませても、ソースコードに関するデバッグ情報がないので、gdb使ってもわかりにくい。そこで、デバッグ情報付きでコンパイルする

$ gcc -g ./test.c
$ ./a.out
program start
zsh: segmentation fault (core dumped)  ./a.out
$ ls 
a.out  core.23570  test.c

このコアダンプファイルをgdbに読み込ませ、エラーの原因を見てみる

$ gdb ./a.out core.23570
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/kimoto/tmp/debug/a.out...done.
[New Thread 23570]
Missing separate debuginfo for
Try: yum --disablerepo='*' --enablerepo='*-debug*' install /usr/lib/debug/.build-id/de/358b9d086df3b8c3991ef34a1320b27779634e
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x00000000004004f1 in main () at ./test.c:10
10       *ptr = 777;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6_3.5.x86_64


これを見ると、10行目の *ptr = 777 でSignal 11で死んでることが分かる。右にSegmentation Faultと書いてあるが、
一応このシグナルの意味を調べると SIGSEGV (セグメンテーション違反) ということでOKですね。

Program terminated with signal 11, Segmentation fault.
#0  0x00000000004004f1 in main () at ./test.c:10
10       *ptr = 777;