概要
拙者「コアダンプ=絶望」という悲しみから脱却したい侍
ポイント
コアファイル解析のコマンドはこう:
$ gdb <実行ファイル> <コアファイル>
arm アーキテクチャ向け実行ファイルの解析時はこう:
$ gdb-multiarch <実行ファイル> <コアファイル>
注意
解析する実行バイナリにデバッグ情報が残ってる必要アリ。
ビルドする時は -g
オプション、-O0
オプションを忘れずに付けよう、ヨシ!
詳細
コアダンプ?
コアダンプとは、プログラムが強制終了した時にコアファイルを吐き出すこと。
プログラムが強制終了した時のメモリ空間を保存したファイルがコアファイルで、これを解析することで、どこで止まったのか、なぜ止まったのかがふんわりわかる。
解析には gdb
というツールを使う。
解析時には、実行バイナリのリンケージを解決できる配置にしておく必要があるっぽい。具体的には、実行時にリンクする動的ライブラリ(.so のやつ)とかが、実行環境と同じ位置関係に存在する必要があるっぽい。知らんけど。
例
gdb での解析を実行すると、↓のようになる。
(gdb)
コンソールで bt
と入力すると、バックトレースが表示され、セグメンテーションフォルト時に何が動いていたかを表示してくれる。
この例では、
-
hoge
関数(fuga.c
の 3353 行目)内のpthread_sigqueue()
関数でセグメンテーションフォルトが発生し、シグナルSIGSEGV
が配送されていること -
pthread_sigqueue()
関数の第一引数が 0 となっており、スレッド識別子が不正であること
が分かる。
注意
-
デバッグ情報が必要
ビルド時には-g
,-O0
をつけるべし。 -
Git ディレクトリにコアファイルを置いちゃダメ!
コアファイルはサイズがでっかい。うっかり Git に登録しちゃうと、「なんかデカいファイルがあってプッシュできない」現象が発生する。ダメ、ゼッタイ。(まあそんなポカをするのは俺くらいだろうけど。。。)