問題描述
如何調試 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
.
這篇關于如何調試 Python 分段錯誤?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!