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ページもありやがるぜ・・・。

Comment on "gdbメモ segmentation fault編"

"gdbメモ segmentation fault編"へのコメントはまだありません。

Post a Comment

コメントする

コメント登録機能が設定されていますが、TypeKey トークンが設定されていません。