¿Qué se necesita para usar el soporte de gdb 7 para depurar progtwigs de Python?

Me gustaría usar el soporte de gdb 7 para depurar los “procesos inferiores” de Python.

¿Qué necesito para poder hacer eso?

Por ejemplo:

Sería muy útil saber qué se necesita en distribuciones particulares. Estoy particularmente interesado en lo que se necesita para Ubuntu y Centos.

Python parece haber sido comstackdo con --with-pydebug (en Ubuntu 12.04, el paquete python-dbg contiene un ejecutable de Python adecuado, llamado python-dbg ). Python inferior no necesita ser Python 2.7 – 2.6 carga las extensiones de 2.7 gdb con éxito (consulte la sesión de depuración a continuación). Al menos en Ubuntu 12.04, el archivo que se instala que define las extensiones gdb se llama libpython.py , no python-gdb.py (por alguna razón, comstackr Python produce un directorio de comstackción que contiene ambos archivos, son idénticos).

Sin embargo, no creo que actualmente sea posible depurar utilizando archivos de núcleo de producción: parece que las extensiones gdb para los procesos inferiores de Python intentan controlar las variables que se optimizan en un binario de producción (por ejemplo, la variable f en PyEval_EvalFrameEx ). Parece que Linux / gdb, y Python aún tiene que alcanzar el nivel de asombro alcanzado para JavaScript en Illumos que Bryan Cantrill informa aquí es capaz de depurar volcados de núcleo de producción de esta manera:

http://www.infoq.com/presentations/Debugging-Production-Systems

Aquí está la sesión de depuración en Ubuntu 12.04 que muestra gdb ejecutando un proceso inferior de Python 2.6 para depurar un segfault, usando las extensiones gdb de Python 2.7. Primero el código para provocar el segfault:

 ~/Downloads/Python-2.6.4$ cat ~/bin/dumpcore.py class Foo: def bar(self): from ctypes import string_at string_at(0xDEADBEEF) # this code will cause Python to segfault def main(): f = Foo() f.someattr = 42 f.someotherattr = {'one':1, 'two':2L, 'three':[(), (None,), (None, None)]} f.bar() if __name__ == "__main__": main() 

y la sesión de depuración:

 ~/Downloads/Python-2.6.4$ gdb --args ./python ~/bin/dumpcore.py GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04 Copyright (C) 2012 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later  This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". For bug reporting instructions, please see: ... Reading symbols from /home/john/Downloads/Python-2.6.4/python...done. (gdb) run Starting program: /home/john/Downloads/Python-2.6.4/python /home/john/bin/dumpcore.py [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Program received signal SIGSEGV, Segmentation fault. 0x0000000000468d67 in PyString_FromString (str=0xdeadbeef 
) at Objects/stringobject.c:116 116 size = strlen(str); (gdb) py-bt Undefined command: "py-bt". Try "help". (gdb) python >import sys >sys.path.insert(0, "/home/john/Downloads/Python-2.7/Tools/gdb") >import libpython >(gdb) py-bt #10 Frame 0x8f0f90, for file /home/john/Downloads/Python-2.6.4/Lib/ctypes/__init__.py, line 496, in string_at (ptr=3735928559, size=-1) return _string_at(ptr, size) #14 Frame 0x8ebf90, for file /home/john/bin/dumpcore.py, line 5, in bar (self=, string_at=) string_at(0xDEADBEEF) # this code will cause Python to segfault #17 Frame 0x8ebd80, for file /home/john/bin/dumpcore.py, line 12, in main (f=) f.bar() #20 Frame 0x8eb680, for file /home/john/bin/dumpcore.py, line 16, in () main() (gdb)

Para Centos 6, simplemente necesitas hacer:

 yum install gdb python-debuginfo debuginfo-install python 

Luego puedes depurar los procesos de Python ejecutándolos simplemente con gdb:

 gdb python [process id] 

Una vez conectado, simplemente escriba:

 py-bt