我有一个Python程序,有时因为"双重免费或腐败而导致崩溃"错误。我试图找出这种情况发生的位置(可能在我正在使用的众多库中),以便我可以防止它崩溃。为此,我启用了核心转储,现在我有一个Apport .crash
文件可供使用。
在这里,我被困住了。如何将核心转储加载到gdb或其他可以让我看到任何堆栈跟踪信息可用的东西?
apport-retrace似乎很棒,但由于.crash
文件中没有包裹而无法加载:
ERROR: report file does not contain one of the required fields: CoreDump DistroRelease Package ExecutablePath
我也无法弄清楚如何将其直接加载到gdb中。我已经在完整的gdb /usr/bin/python <crashfile>
文件上尝试了.crash
,仅在&#34; CoreDump&#34; .crash
文件的一部分,以及&#34; CoreDump&#34;的base64解码版本。部分。每次我收到此错误:
<crashfile> is not a core dump: File format not recognized
有没有办法可以在不需要软件包的情况下使用apport-retrace,或者以gdb可以使用的方式将核心转储从崩溃文件中拉出来?
答案 0 :(得分:3)
事实证明,修改.crash
文件以允许apport-retrace打开它是相当简单的。我只需要添加
Package: python2.7
到文件。为了更好的衡量,我还确保了&#34; ExecutablePath&#34;是为了Python:
ExecutablePath: /usr/bin/python2.7
就我而言,可执行路径以前是一个不同的文件(一个特定于我的程序)。我不知道这一步是否真的有必要。
执行此操作后,我可以运行apport-retrace -g <crashfile>
在gdb中打开它,然后使用bt
来提取堆栈跟踪。
答案 1 :(得分:1)
1)您可以将-R
切换添加到apport-retrace
,而不是修改.crash文件。这会生成一个Packages:字段,如果包系统本身出现崩溃,则可能会丢失该字段。
此外,如果您只想输出回溯,则可以使用-s
开关代替-g
。 -g
加载交互式调试器。这可能看起来像:
apport-retrace -C /tmp/apportcache/ -R -s -S system \
/var/crash/$executable-path.$uid.crash > output.trace
2)另一种方法是通过设置内核参数来禁用apport,从而生成一个二进制核心文件,以便与gdb -c
一起使用。
ulimit -c unlimited
sysctl kernel.core_pattern=/var/crash/core.%e.%p
3)安装apport-retrace后,另请参阅https://wiki.ubuntu.com/DebuggingProgramCrash了解GUI方法。