Captura de segfault con depurador en Python

Quiero depurar un progtwig de Python que a menudo está bloqueado.

Básicamente, mi progtwig ejecuta un servidor espía que acepta solicitudes SOAP. Mi progtwig es multihilo y, a veces, el cliente que utilizo para alcanzar los tiempos de espera.

He probado varios depuradores como PUDB, PDB, WINPDB, PYSTUCK pero no pude detectar ninguna excepción de ellos, de hecho, también están atascados (CTRL + C no funciona …)

Lo mejor que he logrado fue de GDB con el siguiente comando:

gdb -ex r --args python myscript.py 

GDB logra capturar la excepción pero no muestra ninguna información útil:

  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=, nfds=, timeout=) 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 () 

He instalado el paquete python2.7-dbg para habilitar el comando “py-bt” pero no es más útil:

 (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) 

He leído en alguna parte que es porque Python no tiene los símbolos de depuración, entonces he intentado lo siguiente

  gdb -ex r --args python-dbg myscript.py 

Pero tampoco funciona, ni siquiera puedo ejecutar el progtwig, tengo varios errores:

 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 

Me estoy quedando sin opciones …

Detalles sobre mi progtwig: Python: Sistema operativo Python 2.7: Ubuntu 12.04 Server-Side Framework: Spyne (ex SoapLib) También uso Pyro en mi progtwig, que puede ser la causa de todo esto. He deshabilitado el multiproceso en Pyro aunque

¿Has probado el módulo gdb incorporado? Me refiero a python -m pdb myscript.py . Además de eso, puedes importar gdb y codificar algunos puntos de interrupción.

Me las arreglé para obtener un mejor retroceso al correr

 gdb -ex r --args python-dbg myscript.py 

He resuelto los problemas de símbolos (ver arriba) al comstackr el paquete lxml con python-dbg. Tuve algunos problemas para hacer eso pero finalmente funcionó siguiendo los pasos:

 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 

La siguiente publicación ayudó mucho: http://hustoknow.blogspot.fr/2013/06/why-your-python-program-cant-start-when.html

Ahora solo tengo que entender el backtrace 🙂