セグフォとコアダンプ

C/C++のコードがセグメンテーションフォールト(セグフォ)で落ちる場合、突然プロセスが死ぬのでどこで問題が発生したのか分かりにくいです。そんなときに有効な手がかりとなるのがコアダンプです。

GCCデバッグ情報つきでコンパイルする (-gオプション)

$ gcc -g hoge.c -o hoge

コアダンプを出力する設定 (ulimitコマンド)

$ ulimit -c unlimited

これを /etc/profile に記述しておけば再起動後も有効

GDBでコアダンプの解析

$ gdb hoge core

おもなGDBのコマンド

  • backtrace : 関数の呼び出し順表示 短縮形は bt
  • frame n : backtraceで表示された関数のn番目に移動
  • info locals : ローカル変数の一覧表示
  • info args : 引数の一覧表示
  • print val : 変数valの値表示
  • directory : ソースのディレクトリを指定

コアダンプの出力先変更

$ echo /tmp/core > /proc/sys/kernel/core_pattern

別環境で出力されたコアダンプの解析

  • 実行ファイルのほか、その実行ファイルで使用されている共有ライブラリも必要。
  • 必要な共有ライブラリは GDB の info share コマンドで確認できる。
  • 必要な共有ライブラリを適当なディレクトリにコピー。
  • GDB の set solib-absolute-prefix コマンドでパス指定
  • GDB の set solib-search-path コマンドでパス指定