如何调试Python分段错误?
我们正在尝试在SuSE 12.3上运行我们的python代码。我们得到可重现的分段错误。多年来,python代码一直在其他平台上工作而没有分段错误。
我们只编写Python代码,没有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)。我们减少了段错误,但它们仍然存在。 这是存储库的链接:
http://download.opensuse.org/repositories/devel:/languages:/python:/Factory/openSUSE_12.3/x86_64/
更新5 解决了我最初的问题:
http://bugs.python.org/issue1856(关闭(退出)可以在守护程序线程运行时挂起或发生段错误)
答案 0 :(得分:24)
由于Segmentation fault
,我得到了这个问题,但一般情况下我没有退出,而且我发现其他任何事情都没有像faulthandler那样有效。它是Python 3.3的一部分,您可以使用pip
安装在2.7中。
答案 1 :(得分:7)
也许有一个守护程序线程正在运行?有一个可重现的错误,仅针对3.x修复,但不适用于2.x:
http://bugs.python.org/issue1856:
shutdown (exit) can hang or segfault with daemon threads running
这是我自己的问题的答案。找到问题的根源花了一些时间。
以下是下一个问题:如何围绕此错误进行编码:Detect Interpreter shut down in daemon thread
答案 2 :(得分:5)
如果您只执行Python代码(即使是通过导入的第三方模块),则段错误可能意味着解释器或其内置C模块中存在错误。
您可以build CPython and try to debug it yourself或尝试生成重现崩溃的最小脚本file an issue。
答案 3 :(得分:4)
tl; dr(适用于python3用户)。
首先,从文档中:
faulthandler是Python 3.3以来的内置模块
代码用法:
faulthandler.enable()
// bad code goes here
外壳用法:
$ python3 -q -X faulthandler
>>> /// bad cod goes here
答案 4 :(得分:0)
您可以使用故障处理程序执行此操作。例如
import faulthandler; faulthandler.enable()
只需在您的import
语句附近添加此行,然后运行代码。这将有助于调试您或尝试向您显示代码中导致分段错误的最近行。然后,您可以根据需要进行更改。