Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python中的调试器捕获segfault_Python_Debugging_Segmentation Fault_Gdb - Fatal编程技术网

用Python中的调试器捕获segfault

用Python中的调试器捕获segfault,python,debugging,segmentation-fault,gdb,Python,Debugging,Segmentation Fault,Gdb,我想调试一个经常卡住的Python程序 基本上,我的程序运行一个接受SOAP请求的spyne服务器。我的程序是多线程的,有时,我用来访问它的客户端超时 我试过几个调试器,比如PUDB、PDB、WINPDB、pystack,但我没能从它们那里捕捉到任何异常,事实上它们也被卡住了(CTRL+C不工作…) 我所取得的最好成绩是通过以下命令从GDB获得的: gdb -ex r --args python myscript.py GDB设法捕获异常,但不显示任何有用的信息: Program rece

我想调试一个经常卡住的Python程序

基本上,我的程序运行一个接受SOAP请求的spyne服务器。我的程序是多线程的,有时,我用来访问它的客户端超时

我试过几个调试器,比如PUDB、PDB、WINPDB、pystack,但我没能从它们那里捕捉到任何异常,事实上它们也被卡住了(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 ()
我在某个地方读到,这是因为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:Python2.7 操作系统:Ubuntu 12.04 服务器端框架:Spyne(ex-SoapLib)
我也在我的程序中使用了Pyro,这可能是造成这一切的原因。我已经在Pyro上禁用了多线程功能,不过你试过内置的gdb模块吗?我的意思是
python-mpdbmyscript.py
。除此之外,您还可以导入gdb并硬编码一些断点。

我通过运行

gdb -ex r --args python-dbg myscript.py
我已经通过使用pythondbg重新编译包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
以下帖子帮了大忙:


现在我只需要理解回溯:-)

我已经使用标准库中的python查找到了难以发现的致命错误/分段故障。它将创建一个回溯(首先是最近的调用),显示python转储时执行的代码行

例:

它比标准的python回溯有一定的局限性,但至少足以为您指明正确的方向。从文档中:

  • 仅支持ASCII。反斜杠替换错误处理程序用于编码

  • 每个字符串限制为500个字符

  • 仅显示文件名、函数名和行号。(无源代码)

  • 它限制为100帧和100个线程

  • 顺序相反:首先显示最近的调用


我不确定它是否应该这样工作。当我运行python-m gdb myscript.py时,我得到文件“/usr/share/gdb/python/gdb/_init__.py”,第23行,在'gdb.function':os.path.join(gdb.PYTHONDIR,'gdb',function'),NameError:name'os'未定义。是的,我会设置一些断点并减少代码,但是它太大了,这也是我当初使用degugger的原因:)它不是应该是
python-m pdb myscript.py
?python-m pdb myscript.py运行得很好,但无法捕获seqfault。。。它只是在一段时间后卡住了,需要一个kill-9来阻止它
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
import faulthandler


with open("fault_handler.log", "w") as fobj:
    faulthandler.enable(fobj)
    your_function_to_debug()