核心转储是进程意外终止时包含进程的地址空间(内存)的文件。核心转储可以按需生成(例如由调试器生成),也可以在终止时自动生成。核心转储由内核触发以响应程序崩溃, 并可能传递给辅助程序 (如systemd-coredump(8)) 进行进一步处理。普通用户通常不使用核心转储,但开发人员可以将其用作崩溃时程序状态的事后快照,尤其是在故障难以可靠地重现的情况下。
出于多种原因,用户可能希望禁用自动核心转储:
sysctl 可用于将 设置为 no 以禁用核心转储处理。创建此文件kernel.core_pattern
/etc/sysctl.d/50-coredump.conf
kernel.core_pattern=/dev/null
要立即应用该设置,请使用 :sysctl
# sysctl -p /etc/sysctl.d/50-coredump.conf
systemd 的默认行为在 中定义,该行为设置为调用 。它为 中的所有进程生成核心转储。 可以通过在目录中创建包含以下内容[1][2]的配置片段来覆盖行为:/usr/lib/sysctl.d/50-coredump.conf
kernel.core_pattern
systemd-coredump
/var/lib/systemd/coredump
systemd-coredump
/etc/systemd/coredump.conf.d/
/etc/systemd/coredump.conf.d/custom.conf
[Coredump]
Storage=none
[Coredump]
systemd-coredump[1728]: [/etc/systemd/coredump.conf.d/custom.conf:1] Assignment outside of section. Ignoring.
然后使用守护程序重新加载 systemd 管理器配置。
仅此方法通常足以禁用用户空间核心转储,只要没有其他程序在系统上启用自动核心转储,但核心转储仍在内存和 systemd-coredump 运行中生成。
如果要完全禁用除日志条目之外的所有核心转储处理,请设置该选项。请参阅 systemd-coredump(8) § 禁用 coredump 处理。ProcessSizeMax=0
通过 PAM 登录的用户的最大核心转储大小由 limits.conf 强制执行。将其设置为零将完全禁用核心转储。[3]
/etc/security/limits.conf
* hard core 0
bash或zsh等命令行shell提供了一个内置的ulimit命令,可用于报告或设置shell的资源限制以及shell启动的进程。参见 bash(1) § SHELL builtin 命令或 zshbuiltins(1) 了解详细信息。
要禁用当前外壳中的核心转储,请执行以下操作:
$ ulimit -c 0
如果系统设置为使用 将核心转储管道传送到诸如 systemd-coredump 之类的程序中,Linux 会忽略 ulimit 设置,只有 prctl(2) 可用于禁用选定进程的核心转储处理。kernel.core_pattern
dumpable
要生成任意进程的核心转储,请先安装 gdb 包。然后找到正在运行的进程的 PID,例如使用 pgrep:
$ pgrep -f firefox
2071 firefox
附加到进程:
$ gdb -p 2071
然后在提示符下:(gdb)
(gdb) generate-core-file
Saved corefile core.2071
(gdb) quit
现在,您有一个名为 的核心转储文件 .core.2071
sysctl 决定自动核心转储的去向。默认情况下,核心转储将发送到 systemd-coredump,可以在 中配置。默认情况下,所有核心转储都存储在 (由于 )中,并使用 (由于 )进行压缩。此外,还可以配置存储的各种大小限制。kernel.core_pattern
/etc/systemd/coredump.conf
/var/lib/systemd/coredump
Storage=external
zstd
Compress=yes
kernel.core_pattern
/usr/lib/sysctl.d/50-coredump.conf
要从日志中检索核心转储,请参阅 coredumpctl(1)。
使用 coredumpctl 查找相应的转储:
# coredumpctl list
需要唯一标识相关转储。这可以通过指定可执行文件的 、 名称、可执行文件的路径或 journalctl 谓词来实现(有关详细信息,请参阅 coredumpctl(1) 和 journalctl(1)。若要查看核心转储的详细信息,请执行以下操作:PID
# coredumpctl info match
注意“信号”行,这有助于识别崩溃原因。要进行更深入的分析,您可以使用 gdb 检查回溯:
# coredumpctl gdb match
启动 gdb 时,使用以下命令打印回溯:bt
(gdb) bt
如果请求了调试符号,但未找到,请参阅调试/获取跟踪。
存储在 中的核心转储文件将由 自动清理,每天使用 触发。核心转储配置为至少保留 3 天,请参见。/var/lib/systemd/coredump/
systemd-tmpfiles --clean
systemd-tmpfiles-clean.timer
systemd-tmpfiles --cat-config