コアダンプについて

コアダンプファイルは、システム開発時に初期化されていないデータに対する参照、誤ったメモリ参照 (Segmentation Fault) によって吐かれることが多いです。

OS も同じように誤った振る舞いで異常終了された時、プロセスが実行時にエラーで終了した時に、原因解析に必要な実行プログラムのメモリ内容など様々な情報を含んだコアダンプファイルが生成されます。

OS の場合には、原因不明な自立リブートが発生することもあるので、コアダンプは、トラブルの原因究明のためのデバッグ用ファイルとして重要な役割を果たします。

作業項目は、以下の通りです。

  • 現在の環境にコアダンプを設定
  • 再起動後も設定を有効にする
  • コアダンプファイルの出力先を変更・固定する

現在の環境にコアダンプを設定

コアダンプは、一般的にかなり大きなファイルサイズになるため、サーバによっては HDD の負荷を減らすために出力サイズを規制しているケースもあります。

HDD に余裕があるならば、以下のようにコアダンプファイルサイズを unlimited とし、無限大に設定します。

まずは、現在の環境にコマンドベースでコアダンプファイルサイズを設定します。

設定後は、設定が反映されているか確認し、core file size (blocks, -c) unlimited になっていれば OK です。

コマンドラインベースでコアダンプ設定Raw Code(S)Raw Code(T)
# ulimit -S -c unlimited
# ulimit -a | grep 'core file size'
core file size          (blocks, -c) unlimited

再起動後も設定を有効にする

コマンドベースで設定するだけだと 再起動後、設定が消えてしまうため、再起動後も設定が反映されるようにします。

再起動後も設定を有効にするには、/etc/profile を編集し、既存の ulimit 設定を以下のように修正します。

・・・
#ulimit -S -c 0 > /dev/null 2>&1
ulimit -S -c unlimited > /dev/null 2>&1
・・・

コアダンプファイルの出力先を変更・固定する

コアダンプファイル名は、デフォルトで core です。

core ファイルはデフォルトでそのプロセスのカレントディレクトリに出力されるため、コアダンプファイルがとこに吐かれたか探しにくいところもあるため、出力先を変更しておいたほうがいいと思います。

コアダンプファイルの出力先を変更するにあたって、気をつけないと行けないところは、出力先ディレクトリの権限です。

例えば、一般ユーザによって吐かれたコアダンプファイルの出力先のディレクトリにそのユーザの書き込み権限がないとコアダンプファイルは、生成されません。

ここでは例として、誰でも書き込めるディレクトリである /tmp/core をコアダンプファイルの出力先として指定しますが、実際に設定する際には、/tmp ディレクトリは、オススメしません。

まずは、現在の出力先を確認した後、カーネルパラメータを設定し、コアダンプファイルの出力先が /tmp/core になっていることを確認します。

シェル環境に依存しないコアダンプの出力先設定Raw Code(S)Raw Code(T)
# cat /proc/sys/kernel/core_pattern
core

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

# cat /proc/sys/kernel/core_pattern
/tmp/core

/tmp ディレクトリについて

ここでは、例としてコアダンプの出力先ディレクトリとして /tmp を使っています。

システムによっては、/tmp ディレクトリは、再起動するとディレクトリ内のファイルが全て削除されてしまう可能性があるため、コアダンプファイルの出力先として /tmp ディレクトリを指定することは、オススメしません。

コアダンプ出力用のディレクトリを別途用意すると良いでしょう。

# mkdir /coredump

# chmod 777 /coredump

# echo /coredump/core > /proc/sys/kernel/core_pattern

終わりに

コアダンプの解析には、gdb を良く使います。 (使い方は、覚える必要がありますが)

Linux システム上でソフトウェア開発をしている人なら gdb を使ってデバッグしたりしますが、そもそも、サーバエンジニア (SE) は、コアダンプファイルを目の前にする機会はあまりないので、障害が発生したときに解析の仕方が分からなくて困る場合もあります。

使い方は知らなくても、いざとなったときに困らないように gdb の使い方を一読しておいて、どんな機能があるかくらいは認識しておいたほうがいいかもしれません。

おそらく gdb は、デフォルトで入っていると思うので、入っているかどうか一度確認してみてはいかがでしょうか。

gdb バージョン確認Raw Code(S)Raw Code(T)
# gdb --version
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.

ググってみると分かりやすい資料が色々出てくるので、日本語サイトを検索したほうがいいと思いますが、一応、公式っぽいドキュメントは、こちら(英語) をご覧ください。

以上、コアダンプを指定した場所に吐くように設定する方法でした。