systemd-coredump 收集并显示核心转储,用于分析应用程序崩溃。核心转储包含进程在终止时内存的映像。默认情况下,当进程崩溃(或属于应用程序的所有进程)时,它会将核心转储存储在 /var/lib/systemd/coredump 文件中,并将核心转储记录到 systemd 日志中,如果可能,包括回溯。您还可以选择使用其他工具(例如 gdb 或 crash,请参阅 第 18.8 节,“分析崩溃转储”)来检查转储文件。
存储在 /var/lib/systemd/coredump 中的核心转储在三天后会被删除(请参阅 /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。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 2345
Vim 发出错误消息
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 2345PRESENT 列中的星号表示存在存储的核心转储。如果该字段为空,则没有存储的核心转储,并且 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。