20 使用 systemd-coredump
针对应用程序崩溃进行调试 #
systemd-coredump
可收集并显示核心转储,用于分析应用程序崩溃问题。核心转储包含进程内存在终止时的映像。默认情况下,当某个进程(或属于应用程序的所有进程)崩溃时,此工具会将核心转储存储在 /var/lib/systemd/coredump
文件中,并将核心转储记录到 systemd
日记(如有可能,还包括回溯)。您还可以选择使用 gdb
或 crash
等其他工具检查转储文件(请参见第 19.8 节 “分析崩溃转储”)。
存储在 /var/lib/systemd/coredump
中的核心转储在三天后将被删除(请参见 /usr/lib/tmpfiles.d/systemd.conf
中的 d /var/lib/systemd/coredump
行)。
有一个选项不会存储核心转储,而是仅将其记录到日记,这样做有助于尽量减少敏感信息的收集与存储。
20.1 用法和配置 #
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。ExternalSizeMax
还支持 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 2345Vim 会发出错误消息:
Vim: Caught deadly signal SEGV Vim: Finished. Segmentation fault (core dumped)
列出您的核心转储,然后对其进行检查:
#
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
— 在日记中记录核心转储,但不存储。这样做有助于尽量减少敏感信息的收集与存储,例如,出于遵守《通用数据保护条例》(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
。