如何解决日志中的 systemd-coredump 错误:"kernel: Core dump to |/usr/lib/systemd/systemd-coredump pipe failed"

How to resolve systemd-coredump error in journal: "kernel: Core dump to |/usr/lib/systemd/systemd-coredump pipe failed"

我正在尝试在 Ubuntu 18.04 上设置 systemd-coredump,以便我可以捕获并记录我的 C++ 应用程序的崩溃以进行调试。

到目前为止,我已经从 apt 安装了 systemd-coredump 版本 237-3ubuntu10.47,我可以通过向我的应用程序发送分段错误信号来触发崩溃:

sudo kill -s SEGV <application-pid>

但是,我没有像预期的那样在 /var/crash/ 中看到转储。 运行 sudo coredumpctl list 也没有显示任何崩溃;它只回复 No coredumps found.

我读到 the systemd-coredump manual 日志存储在日志中,所以我用 sudo journalctl 打开它并搜索我的 kill 命令。之后,我发现了这个错误信息:

Jun 30 21:53:41 ip-100-90-52-170 kernel: Core dump to |/usr/lib/systemd/systemd-coredump pipe failed

我检查了目录 /usr/lib/systemd/,发现 systemd-coredump 不存在。但是,我不确定这个 ... 文件吗? ..目录?应该是即时创建的。 file/directory 创建期间是否可能存在权限问题,因为 /usr/lib/systemd/root 所有,而我的应用程序作为非特权用户运行?

这是我的 kernel.core_pattern 配置,/usr/lib/sysctl.d/50-coredump.conf。 (这是默认设置。)

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# See sysctl.d(5) for the description of the files in this directory,
# and systemd-coredump(8) and core(5) for the explanation of the
# setting below.

kernel.core_pattern=|/lib/systemd/systemd-coredump %P %u %g %s %t 9223372036854775808 %e

还有我的 coredump 配置,/etc/systemd/coredump.conf(也是默认设置)。

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See coredump.conf(5) for details.

[Coredump]
#Storage=external
#Compress=yes
#ProcessSizeMax=2G
#ExternalSizeMax=2G
#JournalSizeMax=767M
#MaxUse=
#KeepFree=

我也确认我在/etc/systemd/coredump.conf.d/中没有配置片段(事实上,没有那个目录。)

TL;DR:我的 core_pattern/etc/sysctl.d/core.conf 覆盖了。

通过重读 the systemd-coredump manual,我最终意识到 /usr/lib/systemd/systemd-coredump 不仅仅是记录转储的文件或目录,而应该是 systemd-coredump二进制,本身。很明显,它不存在的事实是一个问题。

我还注意到日志中的错误显示内核正在寻找 /usr/lib/systemd/systemd-coredump 中的 systemd-coredump 二进制文件,而不是 /lib/systemd/systemd-coredump,正如我的配置所显示的那样。事实上,二进制 did 存在于 /lib/systemd/systemd-coredump.

因此,我的下一步是找出内核尝试使用 /usr/lib/systemd/systemd-coredump 的原因。为此,我使用 grep 执行了递归文件搜索。我发现包含错误配置的二进制路径的唯一配置文件是 /etc/sysctl.d/core.conf:

kernel.core_pattern = |/usr/lib/systemd/systemd-coredump --backtrace %p %u %g %s %t %e
kernel.core_uses_pid = 0
fs.suid_dumpable = 2
suid_dumpable = 2

虽然在the systemd-coredump manual中没有提到文件/etc/sysctl.d/core.conf,但它显然是覆盖core_pattern的另一种方式,因为我注释掉了[= /etc/sysctl.d/core.conf 中的 27=] 行并重新启动我的 VM,我能够使我的应用程序崩溃并看到转储(日志中没有错误)! :)

$ sudo coredumpctl list
TIME                            PID   UID   GID SIG COREFILE  EXE
Wed 2021-06-30 22:56:23 UTC   23796   888   888  11 present   <my-application>

您从可执行文件 systemd-coredump 不在 /usr/lib/systemd 中得出结论,这不是问题。是的,您的系统正在那里的那个位置寻找那个可执行文件,但没有找到,这导致了错误消息。还有另一个可以设置此位置的文件:/usr/lib/sysctl/50-coredump.conf。我想你会在那里找到合适的位置:

/lib/systemd/systemd-coredump.conf

斯蒂夫