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;