- 1 coredumpctlコマンドとは
- 2 環境
- 3 オプション一覧
- 4 事前準備
- 5 core一覧をする方法(list)
- 6 core出力したプロセスの情報を表示する方法(info)
- 7 coreをファイルに出力する方法(dump)
- 8 特定のcoreを絞り込む方法
- Z 参考情報
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
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ
技術情報・詳細: 技術情報・検索一覧 | NEC
systemd-coredump環境で暮らす - 赤帽エンジニアブログ