systemd-coredump
の使用 #Edit sourcesystemd-coredump
はアプリケーションのクラッシュを解析するため、コアダンプ情報を採取して表示できる仕組みです。コアダンプ内にはアプリケーションがクラッシュした時点でのメモリイメージが含まれています。既定では、プロセス (もしくはアプリケーションに属する複数のプロセス) がクラッシュした場合、可能であればバックトレースを含めて /var/lib/systemd/coredump
にコアダンプを保存して、 systemd
のジャーナル内にその旨を記録します。この出力されたコアダンプをもとに、 gdb
や crash
(詳しくは 18.8項 「クラッシュダンプの解析」 をお読みください) を利用して解析することができます。
なお、 /var/lib/systemd/coredump
内に保存されたコアダンプは、 3 日間が経過すると自動的に削除されます (詳しくは /usr/lib/tmpfiles.d/systemd.conf
ファイル内の d /var/lib/systemd/coredump
の行をお読みください) 。
また、コアダンプを全く保存せず、ジャーナルにのみ記録を行うように設定することもできます。これは、収集によるディスク容量の圧迫と機密情報の保存を防ぐ目的で有用です。
systemd-coredump
は既定で有効化され、すぐに使用できるようになっています。既定の設定ファイルは /etc/systemd/coredump.conf
内に存在しています:
[Coredump] #Storage=external #Compress=yes #ProcessSizeMax=2G #ExternalSizeMax=2G #JournalSizeMax=767M #MaxUse= #KeepFree=
サイズを指定する箇所では、それぞれ B (バイト), K (キロバイト), M (メガバイト), G (ギガバイト), T (テラバイト), P (ペタバイト), E (エクサバイト) の接尾辞を設定することができるほか、 infinity
(無制限) を指定することもできます。
下記の例では、 vim を利用して SEGFAULT を発生させ、ジャーナルとコアダンプを出力させるテスト方法を説明しています。
まずは debuginfo-pool
および debuginfo-update
の各リポジトリを有効化します
vim-debuginfo をインストールします
vim testfile
と入力して実行し、文字を入力します
PID を取得して SEGFAULT を発生させます:
>
ps ax | grep vim 2345 pts/3 S+ 0:00 vim testfile#
kill -s SIGSEGV 2345
vim は下記のようなエラーメッセージを出力するはずです:
Vim: Caught deadly signal SEGV Vim: Finished. Segmentation fault (コアダンプ)
生成されたコアダンプファイルを調査します:
#
coredumpctl TIME PID UID GID SIG PRESENT EXE Wed 2019-11-12 11:56:47 PST 2345 1000 100 11 * /bin/vim#
coredumpctl info PID: 2345 (vim) UID: 0 (root) GID: 0 (root) Signal: 11 (SEGV) Timestamp: Wed 2019-11-12 11:58:05 PST Command Line: vim testfile Executable: /bin/vim Control Group: /user.slice/user-1000.slice/session-1.scope Unit: session-1.scope Slice: user-1000.slice Session: 1 Owner UID: 1000 (tux) Boot ID: b5c251b86ab34674a2222cef102c0c88 Machine ID: b43c44a64696799b985cafd95dc1b698 Hostname: linux-uoch Coredump: /var/lib/systemd/coredump/core.vim.0.b5c251b86ab34674a2222cef102 Message: Process 2345 (vim) of user 0 dumped core. Stack trace of thread 2345: #0 0x00007f21dd87e2a7 kill (libc.so.6) #1 0x000000000050cb35 may_core_dump (vim) #2 0x00007f21ddbfec70 __restore_rt (libpthread.so.0) #3 0x00007f21dd92ea33 __select (libc.so.6) #4 0x000000000050b4e3 RealWaitForChar (vim) #5 0x000000000050b86b mch_inchar (vim) [...]
複数のコアダンプが生成されている場合は、 coredumpctl info
と入力することで、全てのものを表示することができます。このほか、 PID
, COMM
(コマンド), EXE
(実行ファイルのフルパス) などで絞り込むこともできます。たとえば vim に対する全てのコアダンプを表示したい場合は、下記のように入力して実行します:
#
coredumpctl info /bin/vim
特定の PID
が生成したコアダンプを表示したい場合は、下記のように入力して実行します:
#
coredumpctl info 2345
選択したコアダンプを gdb
に出力します:
#
coredumpctl gdb 2345
PRESENT
列にアスタリスク記号が表示されている場合、これは選択したコアダンプが存在していることを表します。この列に何も書かれていない場合はコアダンプが存在していないため、 coredumpctl
はジャーナルから情報を採取するようになります。この動作は、 /etc/systemd/coredump.conf
ファイル内の Storage
セクションの項目を編集することで、変更することができます:
Storage=none
: コアダンプをジャーナル内に記録しますが、保存を行わないようにします。これは General Data Protection Regulation (GDPR) の規則に準拠するなどの目的で収集される情報を最小限に絞ったり、機密情報を記録したりしないようにするための選択肢です。
Storage=external
: コアダンプを /var/lib/systemd/coredump
内に記録するようにします。
Storage=journal
: コアダンプを systemd
のジャーナル内に記録するようにします。
それぞれコアダンプが出力されるたびに systemd-coredump
の新しいインスタンスが起動するようになっていますので、設定を変更したあとにサービスの再起動を行う必要はありません。次回のコアダンプから新しい設定が適用されます。
なお、システムを再起動してしまうと、コアダンプは消去されてしまいます。恒久的にコアダンプを保存したい場合でも、 coredumpctl
側で対応することができます。下記の例では、指定した PID
のコアダンプを vim.dump
ファイル内に保存しています:
#
coredumpctl -o vim.dump dump 2345
コマンドの詳しい説明やオプションの一覧について、詳しくは man systemd-coredump
, man coredumpctl
, man core
, man coredump.conf
をそれぞれお読みください。