gnome-shell
似乎崩溃了,结果很不愉快,开发人员要求我提供回溯,回溯到底是什么,我如何获得他们需要的东西?我正在运行带有 GNOME 3.20 的 Ubuntu GNOME 16.04。
答案1
回溯显示应用程序活动函数的列表。由于函数在调用时相互嵌套,因此应用程序必须记录它离开一个函数的位置以进入其中的另一个函数。这是在堆栈上完成的,然后我们转储堆栈以进行回溯。
准备
为了准备您的系统执行此操作,您必须首先确保已
apport
关闭,因为它通常会替换gdb
。为此,只需将文件中的行更改enabled=1
为(在手动获取回溯后,您应该通过撤消对文件的更改来重新启用 apport),然后重新启动您的机器。enabled=0
/etc/default/apport
现在您需要确保已安装相关的 dubug 符号,为了对大多数软件包执行此操作,只需
-dbg
在末尾添加,例如gnome-shell
只需运行以下命令即可安装它们:sudo apt-get install gnome-shell-dbg
去这里有关手动安装无法通过这种方式获得的调试符号的信息。
现在您需要确保已经
gdb
安装:sudo apt-get install gdb
生成类型 1(需要启动的应用程序)
在终端的控制下启动应用程序
gdb
(如果应用程序需要以 root 身份运行,则在命令sudo
前使用gdb
):gdb <application> 2>&1 | tee ~/gdb-<application>.txt
然后在按下的每一行之后输入以下几行ENTER(之后
run
您可以输入运行应用程序所需的任何必要参数):handle SIG33 pass nostop noprint set pagination 0 run
现在看到最后步骤部分。
生成类型 2(应用程序当前未运行)
查找应用程序的 PID:
pidof <application>
在终端中启动
gdb
(如果应用程序需要以 root 身份运行,则在命令sudo
前使用gdb
):gdb 2>&1 | tee gdb-<application>.txt
按照先前的指示运行以下命令(ENTER每行后按):
handle SIG33 pass nostop noprint set pagination 0 attach <PID> continue
现在看到最后步骤部分。
生成类型 3(来自核心转储的回溯)
将核心转储加载到
gdb
:gdb -c <coreDump> 2>&1 | tee gdb-<program>.txt
最后步骤
如果您使用了生成类型 1 或 2,那么您现在可以对应用程序执行任何您需要的操作来重现您报告的错误。完成后,如果程序没有崩溃,请按CTRL+ C,然后像之前提供的那样运行以下行(如果程序崩溃,您仍然需要运行以下行来获取回溯):
backtrace full
info registers
x/16i $pc
thread apply all backtrace
Quit
现在您已经有了回溯,请将其附加到您的错误报告(文件~/gdb-<application>.txt
)中。
答案2
我不使用 gnome-shell,所以我只是猜测,但以下内容是正确的,不是 csh、bash 和 bash。
设置ulimit -c 5000
。这将允许核心转储。数字设置转储的最大大小。您可能需要改变数字以使命令正常工作。如果 gnome-shell 窗口关闭,则必须重新输入 ulimit 命令。
Ubuntu 确实应该为早期的 LTS 发行版和开发机器启用此功能。
现在运行gnome-shell
并进行转储。当前目录中应该有一个核心文件。
运行gdb $(which gnome-shell) core
。应该会显示某种堆栈跟踪。向他们发送堆栈跟踪。如果 gnome-shell 是用调试编译的,则-g
回溯中可能会有语句编号和函数调用。