方法はいくつかありますので、以下順番に見ていきましょう。
- gccのコンパイルオプションに「-gdb」オプションを付けておく。
- gccのコンパイルオプションに「-efence」オプションを付けておく。
- プログラム実行前に「ulimit -c unlimited」をコマンドライン上で実行しておく。
1. は見初期化変数の使用や、配列の領域侵害(メモリオーバーフローなど)以外の ほとんどでcoreを吐いてくれます。つまり、デフォルトのセグフォ条件に適合した瞬間に プログラムが停止してcoreを吐きます。
2. は、デフォルトではセグフォで停止しない動的メモリ領域の領域侵害(メモリ破壊や、
メモリオーバーフローなどと言う)発生時にセグフォで停止し、coreを吐いてくれるようになる
コンパイルオプションです。
なお、このコンパイルオプションを付けるためには、別途
electric fenceというライブラリをシステムにインストールしておく必要があります。
詳細は、以前解説していますので この記事 を
参照してください。
3. については、ログインしている間中、セグフォが発生するとそのプログラムの
カレントディレクトリにcoreを吐いてくれるようになると言う汎用設定方法です。
生成されたcoreがあれば、この記事で説明したとおり
gdbで簡単にどの行で停止したかをデバッグすることができます。