如何调试 Python 分段错误?
问题描述
如何调试 Python 分段错误?
How can I debug a Python segmentation fault?
我们正在尝试在 SuSE 12.3 上运行我们的 python 代码.我们得到可重现的分段错误.多年来,python 代码一直在其他平台上运行,没有出现分段错误.
We are trying to run our python code on SuSE 12.3. We get reproducible segmentation faults. The python code has been working on other platforms without segmentation faults, for years.
我们只编写 Python 代码,没有 C 扩展......
We only code Python, no C extension ....
调试此问题的最佳方法是什么?我知道一点ansi c,但那是十年前的事了....
What is the best way to debug this? I know a bit ansi c, but that was ten years ago ....
Python 2.7.5
Python 2.7.5
更新
分段错误发生在解释器关闭时.
The segmentation fault happens on interpreter shutdown.
我可以多次运行脚本:
python -m pdb myscript.py arg1 arg1
continue
run
continue
run
但是如果我用 ctrl-d 离开 pdb,就会发生分段错误.
But the segmentation faults happen, if I leave the pdb with ctrl-d.
更新 2
我现在尝试用 gdb 调试它:
I now try to debug it with 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/安装了 gdbinit文件/默认/Misc/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).我们得到的段错误更少,但它们仍然会发生.这是存储库的链接:
Update 4 We installed the a new RPM (python-2.7.5-3.1.x86_64). We get less segfaults, but they still happen. Here is the link to repository:
http://download.opensuse.org/repositories/devel:/languages:/python:/Factory/openSUSE_12.3/x86_64/
更新 5解决了我最初的问题:
原来是http://bugs.python.org/issue1856(关机(退出)可以挂或运行守护线程的段错误)
It was http://bugs.python.org/issue1856 (shutdown (exit) can hang or segfault with daemon threads running)
相关:检测解释器在守护线程中关闭
解决方案
我是因为Segmentation fault
才遇到这个问题的,但是在exit的时候没有,一般情况下,我发现没有别的了与 faulthandler 一样有效.它是 Python 3.3 的一部分,您可以使用 pip
在 2.7 中安装.
I got to this question because of the Segmentation fault
, but not on exit, just in general, and I found that nothing else helped as effectively as faulthandler. It's part of Python 3.3, and you can install in 2.7 using pip
.
相关文章