systemd環境でのコアダンプ解析

systemd環境下においては、従来(systemd無しの環境)のコアダンプ解析とは勝手が違ってくる。

コアダンプを有効にする

ulimitコマンドでcore file sizeが0になっていないことを確認する。

$ ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         unlimited
-m: resident set size (kbytes)      unlimited
-u: processes                       63401
-n: file descriptors                1024
-l: locked-in-memory size (kbytes)  unlimited
-v: address space (kbytes)          unlimited
-x: file locks                      unlimited
-i: pending signals                 63401
-q: bytes in POSIX msg queues       819200
-e: max nice                        0
-r: max rt priority                 99
-N 15:                              unlimited

もしも0になっていたら、次のようにしてコアダンプを有効にする。

$ ulimit -c unlimited

ここまでは従来の方法と同じ。

コアダンプの出力場所

コアダンプの出力場所は /proc/sys/kernel/core_pattern を参照するとわかる。 systemdでは、

$ cat /proc/sys/kernel/core_pattern
|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %e

となっており、 /var/lib/systemd/coredump/ 以下にLZ4で圧縮されて保存される。 保存されるファイル名は core.user-app.1000.adc138b171b140d2bb0a20e628857f04.22015.1515249501000000.lz4 といったものになる。

コアダンプの確認方法

従来の方法だと、次のコマンドでコアダンプの解析が行える。

$ gdb ./user-app core

systemd環境下で前述の方法と同様に行うと、コアダンプの認識に失敗する。

$ gdb ./user-app /var/lib/systemd/coredump/core.user-app.1000.adc138b171b140d2bb0a20e628857f04.22015.1515249501000000.lz4
GNU gdb (GDB) 8.0.1
Copyright (C) 2017 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-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./user-app...done.
"/var/lib/systemd/coredump/core.user-app.1000.adc138b171b140d2bb0a20e628857f04.22015.1515249501000000.lz4" is not a core dump: File format not recognized

これは /var/lib/systemd/coredump/ 以下のコアダンプファイルがLZ4で圧縮されて保存されているためで、LZ4を展開してやればgdbから認識できるようになる。

$ lz4 -d /var/lib/systemd/coredump/core.user-app.1000.adc138b171b140d2bb0a20e628857f04.22015.1515249501000000.lz4 core
$ gdb ./user-app core

しかし、毎回コアダンプを展開するのは手間だ。 そこでsystemdでは coredumpctl というコマンドが用意されている。

coredumpctl の使い方

保存されているコアダンプ一覧を確認する。

$ coredumpctl list
TIME                            PID   UID   GID SIG COREFILE  EXE
Fri 2017-11-24 11:23:30 JST    1242     0     0  11 missing   /usr/lib/udisks2/udisksd
Sun 2017-11-26 00:12:29 JST    1959  1000  1000   5 missing   /usr/bin/ibus-daemon
Sun 2017-11-26 00:16:42 JST   10271  1000  1000   5 missing   /usr/bin/ibus-daemon
Fri 2017-12-15 18:42:18 JST    5242  1000  1000  11 missing   /usr/share/franz/franz
Tue 2017-12-19 22:49:53 JST    2933  1000  1000  11 missing   /opt/dropbox/dropbox
Thu 2017-12-21 02:14:13 JST    1723  1000  1000  11 missing   /usr/share/franz/franz
Fri 2017-12-22 02:04:45 JST    9251  1000  1000  11 missing   /usr/lib/electron/electron
Sun 2018-01-07 01:25:33 JST    6231  1000  1000   8 present   /home/ryo/code/workspace/csfml/user-app

gdbを使ってコアダンプを解析する。例えば、前述のリストから /home/ryo/code/workspace/csfml/user-app の解析をする場合には、PID 6231を指定する。

$ coredumpctl gdb 6231

参考