Depuración de memoria de Python con GDB
linux debugging (4)
Además de todo lo anterior, uno puede implementar rápidamente un rastreador adhoc a través del módulo de rastreo .
Tenemos una aplicación Linux que hace uso de los enlaces Python de OpenSSL y sospecho que está causando bloqueos aleatorios. Ocasionalmente, lo vemos colapsar con el mensaje:
Error fatal de Python: objeto GC ya rastreado
que parece ser un error de programación por parte de la biblioteca o un síntoma de corrupción de memoria. ¿Hay alguna forma de saber la última línea del código fuente de Python que ejecutó, dado un archivo central? O si está conectado en GDB? Me doy cuenta de que probablemente todo esté compilado bytecode, pero espero que alguien haya tratado esto. Actualmente se está ejecutando con el módulo de seguimiento activo y esperamos que vuelva a suceder, pero podría pasar mucho tiempo.
Sí, puedes hacer este tipo de cosas:
(gdb) print PyRun_SimpleString("import traceback; traceback.print_stack()")
File "<string>", line 1, in <module>
File "/var/tmp/foo.py", line 2, in <module>
i**2
File "<string>", line 1, in <module>
$1 = 0
También debería ser posible usar el comando pystack
definido en el archivo python gdbinit , pero no funciona para mí. Se trata aquí si quieres verlo.
Además, si sospecha que hay problemas de memoria, vale la pena señalar que puede usar valgrind
con python, si está preparado para recompilarlo. El procedimiento se describe aquí.
Si está utilizando CDLL para envolver una biblioteca C en python, y esto es Linux de 64 bits, hay muchas posibilidades de que su contenedor CDLL esté mal configurado. CDLL se predetermina a tipos de retorno int en todas las plataformas (debería ser de larga duración en sistemas de 64 bits) y solo espera que ingrese los argumentos correctos. Puede que necesite verificar el contenedor CDLL en este caso ...
Si tiene Mac o Sun Boxing, podría usar dtrace y una versión de python compilada con dtrace para descubrir qué estaba haciendo la aplicación en ese momento. Nota: en 10.5, Python está precompilado con dtrace, que es realmente agradable y útil.
Si no está disponible para usted, puede importar gc y habilitar la depuración, que luego puede enviar a un archivo de registro.
Para responder específicamente a su pregunta con respecto a la depuración con GDB es posible que desee leer " Depuración con GDB " en la wiki de python.