CentOS6でcoreを吐かせる方法

CentOS6ではセグメンテーション違反(segmentation fault)してもcoreを吐かない設定になっている。coreを吐かせてデバッグしたい場合は以下の設定が必要。

OS側の設定

sysctlでcore_patternの設定がABRT(Automated Bug Reporting Tool)になっているのでこれを止める。

$ cat /proc/sys/kernel/core_pattern
|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e

で確認。もしくは、

$ sysctl -a | grep 'kernel.core'
kernel.core_uses_pid = 1
kernel.core_pattern = |/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e
kernel.core_pipe_limit = 4

以下のように手動で変更。

# sysctl -w kernel.core_pattern=core
# sysctl -a | grep 'kernel.core'
kernel.core_uses_pid = 1
kernel.core_pattern = core
kernel.core_pipe_limit = 4
#

リブート後にも設定するためには/etc/sysctl.confに設定を追加する。また、abrt-ccppが起動するとcore_patternの設定をabrt-hook-ccppに変更するようなのでこれも止める。

# vi /etc/sysctl.conf
以下を追加する。
# Default of CentOS6 is
# |/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e
kernel.core_pattern = core

# chkconfig --list | grep abrt
abrt-ccpp    0:off  1:off  2:off  3:on  4:off  5:on  6:off
abrt-oops    0:off  1:off  2:off  3:on  4:off  5:on  6:off
abrtd        0:off  1:off  2:off  3:on  4:off  5:on  6:off
# chkconfig --del abrt-ccpp
# chkconfig --list | grep abrt
abrt-oops    0:off  1:off  2:off  3:on  4:off  5:on  6:off
abrtd        0:off  1:off  2:off  3:on  4:off  5:on  6:off
# sync;sync;sync
# shutdown -rt 0 now

ユーザ側の設定

ulimitを確認し、coreサイズをunlimited(もしくは任意のバイト数)に変更する。

$ ulimit -a
core file size           (blocks, -c) 0
data seg size            (kbytes, -d) unlimited
....
$ ulimit -c unlimited
$ vi ~/.bashrc
ulimit -c unlimited # これを最後の行に追加
$