core dump 1

核心转储是进程意外终止时包含进程的地址空间(内存)的文件。核心转储可以按需生成(例如由调试器生成),也可以在终止时自动生成。核心转储由内核触发以响应程序崩溃, 并可能传递给辅助程序 (如systemd-coredump(8)) 进行进一步处理。普通用户通常不使用核心转储,但开发人员可以将其用作崩溃时程序状态的事后快照,尤其是在故障难以可靠地重现的情况下。

警告:核心转储应仅与受信任方共享,因为它们可能包含敏感数据(如密码或加密密钥)。

禁用自动核心转储

出于多种原因,用户可能希望禁用自动核心转储:

  • 性能:为内存密集型进程生成核心转储可能会浪费系统资源并延迟内存清理。
  • 磁盘空间:内存密集型进程的核心转储可能消耗的磁盘空间等于(如果不是更大)进程的内存占用量(如果未压缩)。
  • 安全性:核心转储虽然通常只能由 root 读取,但可能包含敏感数据(如密码或加密密钥),这些数据在崩溃后写入磁盘。

使用 sysctl

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

systemd 的默认行为在 中定义,该行为设置为调用 。它为 中的所有进程生成核心转储。 可以通过在目录中创建包含以下内容[1][2]的配置片段来覆盖行为:/usr/lib/sysctl.d/50-coredump.confkernel.core_patternsystemd-coredump/var/lib/systemd/coredumpsystemd-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 限制

通过 PAM 登录的用户的最大核心转储大小由 limits.conf 强制执行。将其设置为零将完全禁用核心转储。[3]

/etc/security/limits.conf
* hard core 0

使用ulimit。

bashzsh等命令行shell提供了一个内置的ulimit命令,可用于报告或设置shell的资源限制以及shell启动的进程。参见 bash(1) § SHELL builtin 命令或 zshbuiltins(1) 了解详细信息。

要禁用当前外壳中的核心转储,请执行以下操作:

$ ulimit -c 0

如果系统设置为使用 将核心转储管道传送到诸如 systemd-coredump 之类的程序中,Linux 会忽略 ulimit 设置,只有 prctl(2) 可用于禁用选定进程的核心转储处理。kernel.core_patterndumpable

进行核心转储

要生成任意进程的核心转储,请先安装 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/coredumpStorage=externalzstdCompress=yes

注意:的缺省值在 中设置。此文件可能会被屏蔽或覆盖,以按照正常的 sysctl.d(5) 规则使用不同的设置。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 --cleansystemd-tmpfiles-clean.timersystemd-tmpfiles --cat-config

参见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值