提问者:小点点

如何调试Python分段错误?


如何调试Python分段错误?

我们试图在SuSE 12.3上运行我们的python代码。我们得到了可复制的分割错误。多年来,python代码一直在其他平台上运行,没有出现分段错误。

我们只编码Python,没有C扩展....

最好的调试方法是什么?我知道一点ansi c但那是十年前的事了...

Python 2.7.5

更新

分段错误发生在解释器关闭时。

我可以多次运行脚本:

python -m pdb myscript.py arg1 arg1
continue
run
continue
run

但如果我使用Ctrl-D离开pdb,就会出现分割错误。

更新2

我现在尝试用gdb调试它:

gdb 
> file python
> run myscript.py arg1 arg2
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffefbe2700 (LWP 15483)]
0x00007ffff7aef93c in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
(gdb) bt
#0  0x00007ffff7aef93c in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#1  0x00007ffff7af5303 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.7.so.1.0
#2  0x00007ffff7adc858 in ?? () from /usr/lib64/libpython2.7.so.1.0
#3  0x00007ffff7ad840d in PyObject_Call () from /usr/lib64/libpython2.7.so.1.0
#4  0x00007ffff7af1082 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#5  0x00007ffff7af233d in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#6  0x00007ffff7af233d in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#7  0x00007ffff7af5303 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.7.so.1.0
#8  0x00007ffff7adc5b6 in ?? () from /usr/lib64/libpython2.7.so.1.0
#9  0x00007ffff7ad840d in PyObject_Call () from /usr/lib64/libpython2.7.so.1.0
#10 0x00007ffff7ad9171 in ?? () from /usr/lib64/libpython2.7.so.1.0
#11 0x00007ffff7ad840d in PyObject_Call () from /usr/lib64/libpython2.7.so.1.0
#12 0x00007ffff7aeeb62 in PyEval_CallObjectWithKeywords () from /usr/lib64/libpython2.7.so.1.0
#13 0x00007ffff7acc757 in ?? () from /usr/lib64/libpython2.7.so.1.0
#14 0x00007ffff7828e0f in start_thread () from /lib64/libpthread.so.0
#15 0x00007ffff755c7dd in clone () from /lib64/libc.so.6

更新3

我从http://hg.python.org/cpython/file/default/misc/gdbinit安装了gdbinit,并从http://download.opensuse.org/debug/distribution/12.3/repo/oss/suse/x86_64/安装了调试符号

(gdb) pystack
No symbol "_PyUnicode_AsString" in current context.

现在怎么办?

更新4我们安装了一个新的RPM(python-2.7.5-3.1.x86_64)。我们得到了更少的segfault,但他们仍然发生。这里是到存储库的链接:

http://download.opensuse.org/repositories/devel:/languages:/python:/factory/opensuse_12.3/x86_64/

更新5解决了我最初的问题:

它是http://bugs.python.org/issue1856(shutdown(exit)可以在后台进程线程运行时挂起或segfault)

相关:检测后台进程线程中关闭的解释器


共2个答案

匿名用户

因为segmentation fault,所以我才有了这个问题,但不是在退出时,只是一般情况下,我发现没有其他东西能像faultHandler那样有效地帮助我。它是Python3.3的一部分,您可以使用pip在2.7中进行安装。

匿名用户

TL;DR适用于python3用户。

首先,从文件来看:

faulthandler是Python 3.3的内置模块

代码用法:

faulthandler.enable()
// bad code goes here

外壳用法:

$ python3 -q -X faulthandler
>>> /// bad cod goes here