RaspberryPi[67] Cプログラムで segmentation fault が出たときの後追いデバッグ手順まとめ

「後追いできる」ビルド

segmentation fault が出ても、情報が無ければ原因は追えない。
最初にやるべきことは「デバッグ情報付きでビルドする」こと。

最低限おすすめの gcc オプション

gcc xing_alart_lte.c \
  -g -O1 \
  -Wall -Wextra -Wformat \
  -o xing_alart_lte

各オプションの意味

-g
gdb で行番号・変数名を見るために必須

-O1
最適化しすぎない(-O0でもOK)

-Wall -Wextra -Wformat
未初期化変数や printf 系の事故を警告で炙り出す

※ warning が出ても error が無ければ実行ファイルは生成される

core dump を使った後追いデバッグ

core dump とは

プロセスがクラッシュした瞬間の

・メモリ

・スタック

・レジスタ
を丸ごと保存したファイル。

再現しなくても、後から原因を追えるのが最大の利点。

core が出ない理由(よくある落とし穴)

segfault が出たのに core が無い場合、ほぼこれ。

ulimit -c
# → 0

ulimit -c 0 は
「core dump を出すな」という設定。

今のシェルだけ有効にする

ulimit -c unlimited

確認:

ulimit -c
# unlimited

⚠ 注意
ulimitそのシェル限定

  • 新しいターミナル
  • ssh 再接続
  • systemd サービス

では また 0 に戻る