0

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

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

sudo kill -s SEGV <application-pid>

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

我阅读了日志存储在日志中的systemd-coredump手册,所以我打开它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不存在。但是,我不确定这个...文件是否?..目录?应该是动态创建的。在文件/目录创建期间是否可能存在权限问题,因为我的应用程序以非特权用户身份运行,因为/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/(事实上,没有这样的目录。)

4

2 回答 2

1

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

/lib/systemd/systemd-coredump.conf

史蒂夫

于 2021-09-15T09:01:58.927 回答
0

TL;DR:我core_pattern/etc/sysctl.d/core.conf.

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

我还注意到日志中的错误表明内核正在寻找systemd-coredump二进制文件/usr/lib/systemd/systemd-coredump,而不是/lib/systemd/systemd-coredump我的配置显示的。事实上,二进制文件确实存在于/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

虽然手册/etc/sysctl.d/core.conf中没有提到systemd-coredump文件,但这显然是另一种覆盖该文件的方法core_pattern,因为在我注释掉该kernel.core_pattern/etc/sysctl.d/core.conf并重新启动我的虚拟机后,我能够使我的应用程序崩溃并看到转储(并且日志中没有错误)!:)

$ 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>
于 2021-06-30T23:08:02.577 回答