如何调试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)
相关:检测后台进程线程中关闭的解释器
TL;DR适用于python3用户。
首先,从文件来看:
faulthandler是Python 3.3的内置模块
代码用法:
faulthandler.enable()
// bad code goes here
外壳用法:
$ python3 -q -X faulthandler
>>> /// bad cod goes here
因为segmentation fault
,所以我才有了这个问题,但不是在退出时,只是一般情况下,我发现没有其他东西能像faultHandler那样有效地帮助我。它是Python3.3的一部分,您可以使用pip
在2.7中进行安装。
问题内容: 如何调试Python分段错误? 我们正在尝试在SuSE 12.3上运行python代码。我们得到可再现的分割错误。多年以来,python代码一直在没有分段错误的其他平台上运行。 我们只编写Python,没有C扩展名.... 调试此问题的最佳方法是什么?我知道一点,但这是十年前的事。 Python 2.7.5 更新资料 分段错误发生在解释器关闭时。 我可以多次运行该脚本: 但是,如果我将
运行 rspec 测试时,我突然收到以下错误: /Users/username/.rvm/gems/ruby-2.3.0@rem2/gems/ruby-debug-ide-0.6.0/bin/rdebug-ide --disable-int-handler --evaluation-timeout 10 --rubymine-protocol-extensions --port 50027 --d
本文向大家介绍Python 如何调试程序崩溃错误,包括了Python 如何调试程序崩溃错误的使用技巧和注意事项,需要的朋友参考一下 问题 你的程序崩溃后该怎样去调试它? 解决方案 如果你的程序因为某个异常而崩溃,运行 python3 -i someprogram.py 可执行简单的调试。 -i 选项可让程序结束后打开一个交互式shell。 然后你就能查看环境,例如,假设你有下面的代码: 运行 py
问题内容: 我正在从python开发C扩展,并且获得了一些段错误(在开发过程中不可避免…)。 我正在寻找一种显示段错误发生在哪一行代码的方法(一个想法就像跟踪每一行代码),我该怎么做? 问题答案: 这是一种输出代码运行的Python每行的文件名和行号的方法: 输出: (当然,您可能希望将跟踪输出写入文件。)
问题内容: 我正在使用以下命令将Python异常消息打印到日志文件中: 除了异常字符串以外,是否可以打印有关异常及其生成代码的更多详细信息?行号或堆栈跟踪之类的东西会很棒。 问题答案: 将在错误消息旁边输出堆栈跟踪。 例如: 输出: @Paulo Check指出:“请注意,在Python3中,您必须在零件内部调用该方法。如果在任意位置调用此方法,则可能会遇到奇怪的异常。文档对此有所提示。”
问题内容: 说明: 我试图将一些xml格式的数据发布到API网关。当我使用JAVA HttpsURLConnection将数据发布到Https协议下的一个站点时,收到了 致命警告:handshake_failure 错误。 尝试 1:通过添加启用vm选项的SSL调试, 然后得到以下信息: 尝试 2:尝试使用此解决方案,但没有区别。SSLHandshakeException:收到致命警报:Java