使用Apport崩溃转储来调试Python程序

时间:2015-04-10 22:52:45

标签: python-2.7 ubuntu-14.04 core

我有一个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可以使用的方式将核心转储从崩溃文件中拉出来?

2 个答案:

答案 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方法。