1、概述
• systemd-coredump收集并显示内核核心转储,用于分析应用程序崩溃。当一个进程崩溃(或属于一个应用程序的所有进程)时,它的默认设置是将核心转储记录到systemd日志中,如果可能的话包括回溯,并将核心转储存储在 /var/lib/systemd/coredump.
• 还可以选择使用其他工具检查转储文件,例如gdb或 crash,
• 有一个选项不存储核心转储,而只记录到日志中,这可能有助于最大限度地减少敏感信息的收集和存储。
2、配置
systemd-coredump默认情况下已启用并准备好运行。默认配置在/etc/systemd/coredump.conf:
[Coredump]
#Storage=external
#Compress=yes
#ProcessSizeMax=2G
#ExternalSizeMax=2G
#JournalSizeMax=767M
#MaxUse=
#KeepFree=
下面的例子展示了如何使用 Vim 进行简单的测试,通过创建一个段错误来生成日志条目和一个核心转储。
2.1 使用 VIM 创建核心转储
<1> 启用debuginfo-pool和 debuginfo-update存储库
<2> 安装vim 调试信息
<3> 启动vim testfile并输入几个字符
<4> 获取 PID 并生成段错误:
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)
<5> 列出您的核心转储,然后检查它们:
# coredumpctl
TIME PID UID GID SIG PRESENT EXE
Wed 2022-05-26 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 命令显示所有这些转储;
Filter them by PID, COMM (command), or EXE (full path to the executable),
for example, all core dumps for Vim:
#coredumpctl info /bin/vim
See a single core dump by PID:
#coredumpctl info 2345
Output the selected core to 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 coredump.conf。