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 时,应用程序或运行时没有更新,那么你可以运行此命令而无需等待应用程序再次崩溃。但是,如果应用程序或运行时已更新,则需要在运行命令之前重现崩溃。
然后按照简单的堆栈跟踪说明查看堆栈跟踪并将其复制。