Ubuntu 12.10 でプログラムを走らせた時に segmentation fault
と出力されるのに core ファイルが作成されませんでした。
ulimit -a
コマンドで見てみると、
-c: core file size (blocks) 0
となっていて core ファイルのサイズの上限が 0 = core ファイルを作成しないようになっていたので、ulimit -c unlimited
コマンドで core ファイルの上限を撤廃しました。
-c: core file size (blocks) unlimited
そこでもう一度プログラムを走らせてみたところ、segmentation fault (core dumped)
となり core ファイルを作成したようなメッセージなのですが、実際には作成されていません。
core(5)
を見てみると、/proc/sys/kernel/core_pattern
で core のファイル名を指定できるようになってるみたいなので、見てみました。
# cat /proc/sys/kernel/core_pattern |/usr/share/apport/apport %p %s %c
先頭が「|
」で始まっているとコマンドを実行するみたいです。apport というコマンドが何をやってるのかはよくわかりませんが、/var/log/apport .log
に次のように出力されていました。
ERROR: apport (pid 13004) Wed Jan 2 22:54:29 2013: called for pid 12996, signal 11, core limit 0 ERROR: apport (pid 13004) Wed Jan 2 22:54:29 2013: Unhandled exception: Traceback (most recent call last): File "/usr/share/apport/apport", line 326, in <module> info.add_proc_info(pid) File "/usr/lib/python3/dist-packages/apport/report.py", line 498, in add_proc_info self['ProcMaps'] = _read_maps(int(pid)) File "/usr/lib/python3/dist-packages/apport/report.py", line 88, in _read_maps maps = fd.read().strip() File "/usr/lib/python3.2/encodings/ascii.py", line 26, in decode return codecs.ascii_decode(input, self.errors)[0] UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 1226: ordinal not in range(128) ERROR: apport (pid 13004) Wed Jan 2 22:54:29 2013: pid: 13004, uid: 1000, gid: 1000, euid: 0, egid: 0 ERROR: apport (pid 13004) Wed Jan 2 22:54:29 2013: environment: environ({})
なんとなく apport 自体が正常動作していないような雰囲気です。
よくわからないので apport を使用せず、core.PID ファイルを出力するように次のように設定しました。
# echo core.%p > /proc/sys/kernel/core_pattern
これでちゃんと出力されるようになりました。めでたしめでたし。