使用 Apport 故障转储来调试 Python 程序

问题描述 投票:0回答:2

我有一个 Python 程序,有时会由于“双重释放或损坏”错误而崩溃。我试图找出发生这种情况的位置(可能在我正在使用的众多库之一中),以便我可以防止它崩溃。为此,我启用了核心转储,现在我有一个 Appport

.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
文件的“CoreDump”部分以及“CoreDump”部分的 base64 解码版本上尝试过
.crash
。每次我收到此错误时:

<crashfile> is not a core dump: File format not recognized

有没有一种方法可以在不需要包的情况下使用 apport-retrace 或以 gdb 可以使用的方式从崩溃文件中提取核心转储?

python-2.7 ubuntu-14.04 coredump
2个回答
4
投票

事实证明,修改

.crash
文件以允许 apport-retrace 打开它相当简单。我只需要添加

Package: python2.7

到文件。为了更好地衡量,我还确保“ExecutablePath”适用于 Python:

ExecutablePath: /usr/bin/python2.7

就我而言,可执行路径以前是一个不同的文件(特定于我的程序)。我不知道这一步是否真的有必要。

完成此操作后,我可以运行

apport-retrace -g <crashfile>
在 gdb 中打开它,然后使用
bt
提取堆栈跟踪。


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.