hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

coredumpctlコマンドの使い方



1 coredumpctlコマンドとは

coredumpctl は systemd-coredump(8) によって保存されたコアダンプとメタデータを取得し処理するためのコマンドです。

2 環境

AlmaLinuxの版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 8.6 (Sky Tiger)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
4.18.0-372.9.1.el8.x86_64

coredumpctlコマンドの版数は以下のとおりです。

[root@server ~]# coredumpctl --version
systemd 239 (239-58.el8)
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy

3 オプション一覧

オプションは以下のとおりです。

[root@server ~]# coredumpctl -h
coredumpctl [OPTIONS...]

List or retrieve coredumps from the journal.

Flags:
  -h --help              Show this help
     --version           Print version string
     --no-pager          Do not pipe output into a pager
     --no-legend         Do not print the column headers
     --debugger=DEBUGGER Use the given debugger
  -1                     Show information about most recent entry only
  -S --since=DATE        Only print coredumps since the date
  -U --until=DATE        Only print coredumps until the date
  -r --reverse           Show the newest entries first
  -F --field=FIELD       List all values a certain field takes
  -o --output=FILE       Write output to FILE
  -D --directory=DIR     Use journal files from directory

  -q --quiet             Do not show info messages and privilege warning
Commands:
  list [MATCHES...]  List available coredumps (default)
  info [MATCHES...]  Show detailed information about one or more coredumps
  dump [MATCHES...]  Print first matching coredump to stdout
  debug [MATCHES...] Start a debugger for the first matching coredump

4 事前準備

httpdにSIGSEGVシグナルを送信して、httpdのcoreファイルを作成します。

4.1 ユニット定義ファイル編集

オリジナルのユニット定義ファイルのコピーを作成します。

[root@server ~]# cp /usr/lib/systemd/system/httpd.service /usr/lib/systemd/system/httpd.service.org

ユニット定義ファイルを編集します。

[root@server ~]# vi /usr/lib/systemd/system/httpd.service

編集内容を確認します。ServiceセクションにLimitCORE(単位:バイト数)の設定を追記します。ここでは、coreファイルのサイズを無制限にする設定をします。

[root@server ~]# diff -Nur /usr/lib/systemd/system/httpd.service.org /usr/lib/systemd/system/httpd.service
--- /usr/lib/systemd/system/httpd.service.org   2022-08-06 21:16:33.117451068 +0900
+++ /usr/lib/systemd/system/httpd.service       2022-08-06 21:39:14.476014784 +0900
@@ -27,6 +27,7 @@
 KillSignal=SIGWINCH
 KillMode=mixed
 PrivateTmp=true
+LimitCORE=infinity

 [Install]
 WantedBy=multi-user.target

設定変更をsystemdに通知します。

[root@server ~]# systemctl daemon-reload

httpdサービスを起動します。

[root@server ~]# systemctl start httpd

httpdプロセスの状態を確認します。PID1581が親プロセス、その他はPID1581の子プロセスになります。なお、psコマンドの使い方は、psコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# ps -C httpd -o comm,pid,ppid
COMMAND             PID    PPID
httpd              1581       1
httpd              1582    1581
httpd              1583    1581
httpd              1584    1581
httpd              1585    1581

PID1581のプロセスに対してSIGSEGVシグナルを送信します。

[root@server ~]# kill -SIGSEGV 1581

httpdプロセスがSIGSEGVを受信して終了したため、httpdプロセスが存在しないことがわかります。

[root@server ~]# ps -C httpd -o comm,pid,ppid
COMMAND             PID    PPID

5 core一覧をする方法(list)

listコマンドは、journalに保存されているcoreの一覧を表示します。

[root@server ~]# coredumpctl list
TIME                            PID   UID   GID SIG COREFILE  EXE
Sat 2022-08-06 21:56:38 JST    1581     0     0  11 present   /usr/sbin/httpd

COREFILE列の意味は以下のとおりです。

表示 意味
none coreファイルがjournalに保存されていない状態
- coreファイルが利用できない状態。たとえば、シグナルを受信したけど、プロセスが終了していないとき
present coreファイルを利用できる状態
journal coreファイルがjournalに保存されている状態
truncated coreファイルのサイズが大きいため、coreファイルが全てjournalに保存されていない状態
error coreファイルにアクセスできない状態。たとえば、パーミッションが不十分なとき
missing coreファイルがjournalに保存されたが、削除された状態

6 core出力したプロセスの情報を表示する方法(info)

[root@server ~]# coredumpctl info 1581
           PID: 1581 (httpd)
           UID: 0 (root)
           GID: 0 (root)
        Signal: 11 (SEGV)
     Timestamp: Sat 2022-08-06 21:56:37 JST (1h 5min ago)
  Command Line: /usr/sbin/httpd -DFOREGROUND
    Executable: /usr/sbin/httpd
 Control Group: /system.slice/httpd.service
          Unit: httpd.service
         Slice: system.slice
       Boot ID: 86d38764b1314c9280859d2b9c98de1a
    Machine ID: 971f5080a9c549438e6e9a21eeb90854
      Hostname: server
       Storage: /var/lib/systemd/coredump/core.httpd.0.86d38764b1314c9280859d2b9c98de1a.1581.1659790597000000.lz4
       Message: Process 1581 (httpd) of user 0 dumped core.

                Stack trace of thread 1581:
                #0  0x00007fe14920f1db __select (libc.so.6)
                #1  0x00007fe1498fd919 apr_sleep (libapr-1.so.0)
                #2  0x00005639fbf48b4d ap_wait_or_timeout (httpd)
                #3  0x00007fe13e3d8041 event_run (mod_mpm_event.so)
                #4  0x00005639fbf4815e ap_run_mpm (httpd)
                #5  0x00005639fbf40733 main (httpd)
                #6  0x00007fe149122ca3 __libc_start_main (libc.so.6)
                #7  0x00005639fbf4087e _start (httpd)

7 coreをファイルに出力する方法(dump)

journalに保存されているcoreをhttpd.coreという名前のファイルに保存します。

[root@server ~]# coredumpctl -o httpd.core dump

保存したcoreファイルを確認します。

[root@server ~]# ls -lh httpd.core
-rw-r--r--. 1 root root 3.5M  8月  6 23:35 httpd.core

debuginfoパッケージをインストールするため、httpdパッケージの版数を確認します。

[root@server ~]# rpm -qa|grep httpd
httpd-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64
-snip-

httpdのdebuginfoパッケージをインストールします。

[root@server ~]# dnf debuginfo-install httpd-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64

httpdの実行ファイルのパスと保存したcoreファイルを指定してgdbコマンドを実行します。

[root@server ~]# gdb /usr/sbin/httpd httpd.core

gdbを起動します。そして、btコマンドを実行します。httpdソースコードについては、引数が表示されていることがわかります。

(gdb) bt
#0  0x00007fe14920f1db in select () from /lib64/libc.so.6
#1  0x00007fe1498fd919 in apr_sleep () from /lib64/libapr-1.so.0
#2  0x00005639fbf48b4d in ap_wait_or_timeout (status=status@entry=0x7ffd93be01d8,
    exitcode=exitcode@entry=0x7ffd93be01dc, ret=ret@entry=0x7ffd93be01e0, p=<optimized out>, s=<optimized out>)
    at mpm_common.c:201
#3  0x00007fe13e3d8041 in server_main_loop (num_buckets=1, remaining_children_to_start=0) at event.c:2904
#4  event_run (_pconf=<optimized out>, plog=<optimized out>, s=<optimized out>) at event.c:3082
#5  0x00005639fbf4815e in ap_run_mpm (pconf=0x5639fc4c6a18, plog=0x5639fc4f3c38, s=0x5639fc4efcc0) at mpm_common.c:94
#6  0x00005639fbf40733 in main (argc=<optimized out>, argv=<optimized out>) at main.c:819

さらに、glibcのdebuginfoパッケージをインストールします。

[root@server ~]# dnf debuginfo-install glibc-2.28-189.1.el8.x86_64

再度、gdbを起動します。そして、btコマンドを実行します。glibcのdebuginfoパッケージをインストールしたことで、selectシステムコールの引数が表示されるようになったことがわかります。

(gdb) bt
#0  0x00007fe14920f1db in __GI___select (nfds=0, readfds=0x0, writefds=0x0, exceptfds=0x0, timeout=0x7ffd93be0110)
    at ../sysdeps/unix/sysv/linux/select.c:41
#1  0x00007fe1498fd919 in apr_sleep () from /lib64/libapr-1.so.0
#2  0x00005639fbf48b4d in ap_wait_or_timeout (status=status@entry=0x7ffd93be01d8,
    exitcode=exitcode@entry=0x7ffd93be01dc, ret=ret@entry=0x7ffd93be01e0, p=<optimized out>, s=<optimized out>)
    at mpm_common.c:201
#3  0x00007fe13e3d8041 in server_main_loop (num_buckets=1, remaining_children_to_start=0) at event.c:2904
#4  event_run (_pconf=<optimized out>, plog=<optimized out>, s=<optimized out>) at event.c:3082
#5  0x00005639fbf4815e in ap_run_mpm (pconf=0x5639fc4c6a18, plog=0x5639fc4f3c38, s=0x5639fc4efcc0) at mpm_common.c:94
#6  0x00005639fbf40733 in main (argc=<optimized out>, argv=<optimized out>) at main.c:819

8 特定のcoreを絞り込む方法

8.1 事前準備

もう1つcoreファイルを作成します。次は、viのcoreファイルを取得してみます。まず、coreファイルのサイズを無限に設定します。なお、恒久的な設定は、/etc/security/limits.confに対して行います。

[root@server ~]# ulimit -c unlimited
[root@server ~]# ulimit -c
unlimited

viを実行します。

[root@server ~]# vi aaa

もう1つターミナルを起動して、viのPIDを確認します。

[root@server ~]# ps -C vi
    PID TTY          TIME CMD
   2379 pts/0    00:00:00 vi

viプロセスに対してSIGSEGVシグナルを送信します。

[root@server ~]# kill -SIGSEGV 2379

coreの一覧を確認します。

[root@server ~]# coredumpctl list
TIME                            PID   UID   GID SIG COREFILE  EXE
Sun 2022-08-07 21:24:06 JST    1463     0     0  11 present   /usr/sbin/httpd
Sun 2022-08-07 21:38:18 JST    2379     0     0  11 present   /usr/bin/vi

8.2 本日出力されたcoreを確認する方法(today)

[root@server ~]# coredumpctl list -S today
TIME                            PID   UID   GID SIG COREFILE  EXE
Sun 2022-08-07 21:24:06 JST    1463     0     0  11 present   /usr/sbin/httpd
Sun 2022-08-07 21:38:18 JST    2379     0     0  11 present   /usr/bin/vi

8.3 特定の日時以降のcoreを確認する方法(-S)

[root@server ~]# coredumpctl list -S "2022-08-07 21:38:10"
TIME                            PID   UID   GID SIG COREFILE  EXE
Sun 2022-08-07 21:38:18 JST    2379     0     0  11 present   /usr/bin/vi