Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
適用先 openSUSE Leap 15.7

19 アプリケーションクラッシュ時の systemd-coredump の使用 Edit source

systemd-coredump はアプリケーションのクラッシュを解析するため、コアダンプ情報を採取して表示できる仕組みです。コアダンプ内にはアプリケーションがクラッシュした時点でのメモリイメージが含まれています。既定では、プロセス (もしくはアプリケーションに属する複数のプロセス) がクラッシュした場合、可能であればバックトレースを含めて /var/lib/systemd/coredump にコアダンプを保存して、 systemd のジャーナル内にその旨を記録します。この出力されたコアダンプをもとに、 gdbcrash (詳しくは 18.8項 「クラッシュダンプの解析」 をお読みください) を利用して解析することができます。

なお、 /var/lib/systemd/coredump 内に保存されたコアダンプは、 3 日間が経過すると自動的に削除されます (詳しくは /usr/lib/tmpfiles.d/systemd.conf ファイル内の d /var/lib/systemd/coredump の行をお読みください) 。

また、コアダンプを全く保存せず、ジャーナルにのみ記録を行うように設定することもできます。これは、収集によるディスク容量の圧迫と機密情報の保存を防ぐ目的で有用です。

19.1 使用と設定 Edit source

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 を発生させ、ジャーナルとコアダンプを出力させるテスト方法を説明しています。

手順 19.1: vim を利用したコアダンプの作成
  1. まずは debuginfo-pool および debuginfo-update の各リポジトリを有効化します

  2. vim-debuginfo をインストールします

  3. vim testfile と入力して実行し、文字を入力します

  4. 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 (コアダンプ)
  5. 生成されたコアダンプファイルを調査します:

    # 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 をそれぞれお読みください。

このページを印刷