C言語:セグメンテーションフォルト(セグフォ)時にcore(コア)を吐かせる方法

2010年2月14日

C言語プログラミングを行っているときに、セグフォを目にすることは良くあると思います。 また、実際にサービスとして運用しているプログラムが予期せぬタイミングでセグフォで 停止していた。。。なんてことを経験された方も数多くいらっしゃると思います。

そんなとき、core(コア)を吐かせるようにシステムに設定をしておけば、どこで何が原因で プログラムが停止したのかが瞬時に分かるので便利です。



方法はいくつかありますので、以下順番に見ていきましょう。

  1. gccのコンパイルオプションに「-gdb」オプションを付けておく。
  2. gccのコンパイルオプションに「-efence」オプションを付けておく。
  3. プログラム実行前に「ulimit -c unlimited」をコマンドライン上で実行しておく。

上記いずれも、プログラム停止時にcoreを吐いてくれるようになります。 ですが、上記 1. と 2. は若干停止条件が異なりますので注意してください。 


1. は見初期化変数の使用や、配列の領域侵害(メモリオーバーフローなど)以外の ほとんどでcoreを吐いてくれます。つまり、デフォルトのセグフォ条件に適合した瞬間に プログラムが停止してcoreを吐きます。


2. は、デフォルトではセグフォで停止しない動的メモリ領域の領域侵害(メモリ破壊や、 メモリオーバーフローなどと言う)発生時にセグフォで停止し、coreを吐いてくれるようになる コンパイルオプションです。

なお、このコンパイルオプションを付けるためには、別途 electric fenceというライブラリをシステムにインストールしておく必要があります。 詳細は、以前解説していますので この記事 を 参照してください。

3. については、ログインしている間中、セグフォが発生するとそのプログラムの カレントディレクトリにcoreを吐いてくれるようになると言う汎用設定方法です。

生成されたcoreがあれば、この記事で説明したとおり gdbで簡単にどの行で停止したかをデバッグすることができます。