如何调试Python分段错误?

gue*_*tli 44 python segmentation-fault

如何调试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
Run Code Online (Sandbox Code Playgroud)

但是如果我使用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
Run Code Online (Sandbox Code Playgroud)

更新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.
Run Code Online (Sandbox Code Playgroud)

现在怎么办?

更新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(shutdown(exit)可以挂起或段落运行守护程序线程)

相关:检测解释器在守护程序线程中关闭

Ols*_*nsk 34

tl; dr for python3 用户。

首先,从文档:

faulthandler是自 Python 3.3 以来的内置模块

代码用法:

faulthandler.enable()
// bad code goes here
Run Code Online (Sandbox Code Playgroud)

外壳用法:

$ python3 -q -X faulthandler
>>> /// bad cod goes here
Run Code Online (Sandbox Code Playgroud)


mar*_*omo 29

我得到了这个问题,因为它Segmentation fault,但不是退出,只是一般,我发现没有其他任何帮助像faulthandler一样有效.它是Python 3.3的一部分,你可以使用2.7安装pip.

  • 只需在 shell 中导出 PYTHONFAULTHANDLER=1 即可。 (19认同)
  • 请在您的帖子中显示如何启用故障处理程序,谢谢。 (3认同)

gue*_*tli 8

也许有一个守护程序线程在运行?有一个可重现的错误,仅针对3.x修复,但不适用于2.x:

http://bugs.python.org/issue1856:

shutdown (exit) can hang or segfault with daemon threads running
Run Code Online (Sandbox Code Playgroud)

这是我自己的问题的答案.找到问题的根源需要一些时间.

下面是下一个问题:如何编写此错误代码:检测解释器在守护程序线程中关闭


ice*_*ime 5

如果您只执行Python代码(即使是通过导入的第三方模块),则段错误可能意味着解释器或其内置C模块中存在错误.

您可以构建CPython并尝试自己调试它,或者尝试生成最小的脚本来重现崩溃并提出问题.


小智 5

如上所述,您可以使用 faulthandler 执行此操作。例如

import faulthandler; faulthandler.enable()
Run Code Online (Sandbox Code Playgroud)

只需在您的import语句附近添加此行并运行代码。这将有助于调试您或尝试在您的代码中向您显示导致分段错误的最近行。然后,您可以根据需要进行更改。

  • 在开头或任何地方添加此行?我们是否需要做点别的事情 (2认同)