Stack Traces#

当你的电脑上的程序崩溃时,会生成一个核心转储,其中存储了程序崩溃时的状态。可以使用核心转储生成堆栈跟踪,这允许开发者调查并希望修复崩溃。开发者希望你在报告崩溃时附上堆栈跟踪。本页描述了如何生成此堆栈跟踪。

堆栈跟踪也称为“回溯”。它们是同一回事。

先决条件#

本指南使用一种简单的生成堆栈跟踪的方法,适用于许多现代 Linux 系统。要检查你是否可以使用这种简单的方法,你需要验证你的系统是否启用了 systemd-coredump 和 debuginfod。

要检查 systemd-coredump 是否已启用,请运行

$ cat /proc/sys/kernel/core_pattern

这应该返回一些包含 systemd-coredump 的文本。

要检查 debuginfod 是否已启用,请运行

$ echo $DEBUGINFOD_URLS

这应该返回一个 URL。

如果这两个测试中的任何一个失败,那么你需要手动获取堆栈跟踪。有关如何操作的详细信息,请参阅 这篇博文

简单的堆栈跟踪#

如果你的系统具有上述先决条件,并且你报告的崩溃不是来自 Flatpak 应用程序,则可以按照以下步骤操作。

首先安装 gdb,GNU 调试器,如果尚未安装。然后只需运行以下命令

$ coredumpctl gdb
(gdb) bt full

这将为系统上发生的最后一次崩溃生成堆栈跟踪。在此过程中,你可能会被问到一些问题

  • 如果你被问到 Enable debuginfod for this session? (y or [n]),请输入 y 并按回车键。

  • 如果你被问到是否要继续不分页,请输入 c 并按回车键。(你可能需要多次执行此操作。)

  • 一旦提示显示 (gdb),则已打印完整的堆栈跟踪。输入 q 并按回车键退出。

现在将你输入 bt full 后打印的所有内容复制到文本文件中,并将其附加到你的问题报告中。完成了!

Flatpak 应用程序的堆栈跟踪#

获取 Flatpak 应用程序的堆栈跟踪与上述方法非常相似,但需要一些额外的设置步骤。

安装调试扩展#

要获取大多数 Flatpak 应用程序的堆栈跟踪,包括由 GNOME 或 Flathub 分发的应用程序,你首先需要为 Flatpak 应用程序及其使用的运行时安装调试扩展。

首先,获取你想要生成堆栈跟踪的应用程序的 ID。为此,运行 flatpak list 并检查“Application ID”列中的应用程序。例如,对于 GNOME Web,应用程序 ID 显示为 org.gnome.Epiphany

接下来,确认应用程序使用的运行时的 ID。例如

$ flatpak info org.gnome.Epiphany | grep Runtime
Runtime: org.gnome.Platform/x86_64/master

在此示例中,org.gnome.Platform 是运行时的 ID。这是 GNOME 运行时。

现在是时候安装调试扩展了。在这里,你需要安装应用程序的调试扩展、与应用程序使用的运行时匹配的 SDK 以及 SDK 的调试扩展。例如,对于使用 GNOME 运行时的 GNOME Web,你将运行

$ flatpak install org.gnome.Epiphany.Debug
$ flatpak install org.gnome.Sdk
$ flatpak install org.gnome.Sdk.Debug

注意:如果崩溃发生在由 Fedora 构建的 Flatpak 中,则没有调试扩展。相反,你只需要安装与应用程序使用的 org.fedoraproject.Platform 版本对应的 org.fedoraproject.Sdk 运行时。

最后,你需要运行 flatpak update 以确保调试扩展的版本与运行时和应用程序的版本完全匹配

$ flatpak update

获取堆栈跟踪#

安装调试扩展后,你就可以获取堆栈跟踪了。这与获取非 Flatpak 应用程序的堆栈跟踪类似,但你将使用 flatpak-coredumpctl 命令代替直接使用 coredumpctl,如下所示

$ flatpak-coredumpctl org.gnome.Epiphany
(gdb) bt full

如果当你运行 flatpak update 时,应用程序或运行时没有更新,那么你可以运行此命令而无需等待应用程序再次崩溃。但是,如果应用程序或运行时已更新,则需要在运行命令之前重现崩溃。

然后按照简单的堆栈跟踪说明查看堆栈跟踪并将其复制。