2009年03月05日
gdbメモ segmentation fault編
Linux上でC++でプログラムを作成すると、segmentation faultで落ちてしまうことがある。
Javaと違い、スタックトレースをデフォルトで表示しないため、どこで落ちたのかわかりにくい。
で、そんなときはgdbの出番というわけだ。
gdbは取っつきにくく、デバッグするたびにgdbに関する情報を検索するのでは効率が悪いのでメモに残しておく。
まず実行ファイルにデバッグ情報を付与するためコンパイルオプションを設定。
最適化はO2ぐらいにしとくのが良いらしい。
-O2 -ggdb
そしてgdbから実行。
$ gdb ./exefile
デバッグ対象ファイルの実行はrコマンドで実行。
引数を与える場合は以下のような感じで。
(gdb) r arg1 arg2
こけたらソースコードの位置を教えてくれる。
いちいちgdbから実行するのはめんどくさいよ!と言う人はcoreファイルを使う。
segmentation fault時にcoreを吐かない場合はcoreファイルサイズの最大値に達している可能性がある。
まずcoreファイルサイズの設定。以下みたいな感じでサイズ無制限に。
$ limit coredumpsize unlimited
coreが無事に吐かれたらそれをgdbに食わせる。
$ gdb ./exefile core.1234
するとどのファイルの何行目で落ちたかが表示される。
スタックトレースを表示させる場合はwhereコマンドを使用する。
(gdb) where
するとスタックトレースが表示される。
行番号とか表示されない場合はデバッグ情報が実行ファイルに存在しない可能性がある。
gdbマニュアル日本語版
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gdb-5.0/gdb-ja_toc.html
それのPDF版
http://www.asahi-net.or.jp/~wg5k-ickw/pdf/gdb/gdb-5.0-pdf-020110.tar.gz
PDF版のマニュアル300ページもありやがるぜ・・・。
"gdbメモ segmentation fault編"へのコメントはまだありません。