Existen extensiones de python algo indocumentadas para gdb.
Desde la toma de origen de Python Tools/gdb/libpython.py
(no se incluye en una instalación normal).
poner esto en sys.path
continuación:
# gdb /gps/python2.7_x64/bin/python coredump
...
Core was generated by `/usr/bin/python script.py'.
Program terminated with signal 11, Segmentation fault.
#0 call_function (oparg=<optimized out>, pp_stack=0x7f9084d15dc0) at Python/ceval.c:4037
...
(gdb) python
>import libpython
>
>end
(gdb) bt
#0 call_function (oparg=<optimized out>, pp_stack=0x7f9084d15dc0) at Python/ceval.c:4037
#1 PyEval_EvalFrameEx ([email protected]=
Frame 0x7f9084d20ad0,
for file /usr/lib/python2.7/site-packages/librabbitmq/__init__.py, line 220,
in drain_events (self=<Connection(channels={1: <Channel(channel_id=1, connection=<...>, is_open=True, connect_timeout=4, _default_channel=<....(truncated), [email protected]=0) at Python/ceval.c:2681
...
(gdb) py-list
218 else:
219 timeout = float(timeout)
>220 self._basic_recv(timeout)
221
222 def channel(self, channel_id=None):
Como se puede ver ahora tenemos visibilidad en el conjunto Python correspondiente a la cadena de llamadas CPython.
Algunas advertencias:
- Su versión de GDB tiene que ser mayor que 7 y tiene que haber sido compilado con
--with-python
gdb
incrusta pitón (mediante la vinculación a libpython
), no se ejecuta en una subcamada Esto significa que puede no coincidir necesariamente con la versión de python que está en $PATH
.
- Debe descargar
libpython.py
desde cualquier versión de la fuente de Python que coincida con lo que gdb
está vinculado.
- Puede que tenga que ejecutar gdb como root; si es así, puede que necesite configurar
sys.path
para que coincida con el código que está depurando.
Si no puede copiar libpython.py
en sys.path
continuación, puede agregar su ubicación a sys.path
así:
(gdb) python
>import sys
>sys.path.append('/path/to/containing/dir/')
>import libpython
>
>end
Esto es algo poco documentada en el python dev docs, the fedora wiki y the python wiki
Si tiene un gdb
anterior o simplemente no puede conseguir que funcione allí también es un gdbinit en la fuente de Python que puede copiar a ~/.gdbinit
w Que añadir una funcionalidad similar
¿Funciona esto con las extensiones C? –
@MadPhysicist: No imprimirá los números de línea de su código C, si eso es lo que quiere decir. :-) Imprimirá los números de línea del código Python que llama a su código C. – RichieHindle
Eso fue lo que quise decir. La pregunta original me pareció interesante porque tuve el mismo problema. El segfault resultó ser porque mi código C estaba insertando un elemento NULL en un PyList_Object. Se manifestó en el lado de Python cuando traté de iterar sobre la lista. No estoy seguro de que un depurador de Python hubiera ayudado mucho en ese caso. –