我想调试一个经常被卡住的Python程序。
基本上,我的程序运行一个接受SOAP请求的spyne-server。我的程序是多线程的,有时候,我用来达到超时的客户端。
我已经尝试了几个调试器,如PUDB,PDB,WINPDB,PYSTUCK,但是我无法捕获它们的任何异常,实际上它们也恰好被卡住了(CTRL + C不起作用。 ..)
我所取得的最好成绩来自GDB,命令如下:
gdb -ex r --args python myscript.py
GDB设法捕获异常,但没有显示任何有用的信息:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffd7fff700 (LWP 22573)]
0x000000000057656d in PyEval_EvalCodeEx ()
(gdb) info threads
Id Target Id Frame
* 15 Thread 0x7fffd7fff700 (LWP 22573) "python" 0x000000000057656d in PyEval_EvalCodeEx ()
7 Thread 0x7fffecc2c700 (LWP 22277) "python" 0x00007ffff6998653 in select () at ../sysdeps/unix/syscall-template.S:82
6 Thread 0x7fffed42d700 (LWP 22276) "python" 0x00007ffff6998653 in select () at ../sysdeps/unix/syscall-template.S:82
5 Thread 0x7fffedc2e700 (LWP 22271) "python" sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86
4 Thread 0x7fffee42f700 (LWP 22270) "python" sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86
3 Thread 0x7fffef9e8700 (LWP 22261) "python" 0x00007ffff6993933 in __GI___poll (fds=<optimized out>, nfds=<optimized out>,
timeout=<optimized out>) at ../sysdeps/unix/sysv/linux/poll.c:87
2 Thread 0x7ffff613f700 (LWP 21988) "python" 0x00007ffff7bcc04d in accept () at ../sysdeps/unix/syscall-template.S:82
1 Thread 0x7ffff7fd6700 (LWP 20970) "python" 0x00007ffff6998653 in select () at ../sysdeps/unix/syscall-template.S:82
(gdb) bt
#0 0x000000000057656d in PyEval_EvalCodeEx ()
#1 0x0000000000577ab0 in function_call.15039 ()
#2 0x00000000004d91b6 in PyObject_Call ()
#3 0x000000000054d8a5 in PyEval_EvalFrameEx ()
#4 0x000000000054c272 in PyEval_EvalFrameEx ()
#5 0x000000000054c272 in PyEval_EvalFrameEx ()
#6 0x000000000054c272 in PyEval_EvalFrameEx ()
#7 0x000000000054c272 in PyEval_EvalFrameEx ()
#8 0x000000000054c272 in PyEval_EvalFrameEx ()
我已经安装了包python2.7-dbg来启用命令&#34; py-bt&#34;但它没有用处:
(gdb) py-bt
#7 (unable to read python frame information)
#8 (unable to read python frame information)
#16 (unable to read python frame information)
#17 (unable to read python frame information)
#18 (unable to read python frame information)
#27 (unable to read python frame information)
#28 (unable to read python frame information)
#32 (unable to read python frame information)
#33 (unable to read python frame information)
#34 (unable to read python frame information)
我已经读过某个地方因为Python没有调试符号然后我尝试了以下
gdb -ex r --args python-dbg myscript.py
但它也没有用,我甚至无法运行程序,我有几个错误:
ImportError: /usr/lib/python2.7/dist-packages/lxml/etree.so: undefined symbol: Py_InitModule4_64
ImportError: /usr/lib/python2.7/dist-packages/apt_pkg.so: undefined symbol: Py_InitModule4_64
我的选项用完了......
我的计划详情: Python:Python 2.7 操作系统:Ubuntu 12.04 服务器端框架:Spyne(来自SoapLib) 我也在我的程序中使用Pyro,这可能是所有这些的原因。我已经在Pyro上禁用了多线程但是
答案 0 :(得分:2)
您是否尝试过内置的gdb模块?我的意思是python -m pdb myscript.py
。最重要的是,你可以导入gdb并硬编码一些断点。
答案 1 :(得分:2)
我通过运行
设法获得了更好的回溯gdb -ex r --args python-dbg myscript.py
我通过使用python-dbg重新编译包lxml来解决符号问题(参见上文)。我遇到了一些麻烦,但最终按照以下步骤进行了工作:
pip install lxml --download-cache myDir
# for newer pip, use : pip install lxml --download myDir --no-use-wheel
cd myDir
tar -xvf lxml-4.2.1.tar.gz
cd lxml-4.2.1
sudo apt-get install libxslt-dev
sudo apt-get install gcc
sudo apt-get install python-dev
sudo apt-get install python-dbg
sudo python-dbg setup.py install
以下帖子帮助很多: http://hustoknow.blogspot.fr/2013/06/why-your-python-program-cant-start-when.html
现在我只需了解回溯: - )
答案 2 :(得分:1)
我一直努力使用标准库中的python faulthandler来查找致命的错误/段错误。它将创建一个回溯(首先是最近的调用),以显示python进行转储时正在执行的代码行。
例如:
import faulthandler
with open("fault_handler.log", "w") as fobj:
faulthandler.enable(fobj)
your_function_to_debug()
它比标准的python回溯有更多的限制,但足以至少为您指明正确的方向。从文档中:
仅支持ASCII。反斜杠错误处理程序用于编码。
每个字符串限制为500个字符。
仅显示文件名,函数名称和行号。 (无源代码)
它限制为100帧和100个线程。
顺序相反:最近的呼叫首先显示。