Pregunta

Tenemos una aplicación de Linux que utiliza los enlaces de Python de OpenSSL y sospecho que está causando bloqueos aleatorios. Ocasionalmente, vemos que se bloquea 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 manera de saber la última línea de código fuente de Python que ejecutó, dado un archivo central? ¿O si está adjunto en GDB? Me doy cuenta de que probablemente todo sea bytecode compilado, pero espero que alguien por ahí haya tratado con esto. Actualmente se está ejecutando con el módulo de rastreo activo y esperamos que vuelva a suceder, pero podría pasar mucho tiempo.

¿Fue útil?

Solución

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 python gdbinit , pero no me funciona. Se discute aquí si desea analizarlo.

Además, si sospecha problemas de memoria, vale la pena señalar que puede usar valgrind con python, si estás preparado para recompilarlo. El procedimiento se describe aquí.

Otros consejos

Si tienes mac o sun box dando vueltas, puedes usar dtrace y una versión de Python compiló 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 práctico.

Si eso no está disponible para usted, puede import gc y habilite la depuración que luego puede poner en un archivo de registro.

Para responder específicamente a su pregunta sobre la depuración con GDB, puede leer " Depuración con GDB " en el wiki de python.

Si está utilizando CDLL para envolver una biblioteca C en python, y esto es Linux de 64 bits, existe una buena posibilidad de que su envoltorio CDLL esté mal configurado. El valor predeterminado de CDLL es int return types en todas las plataformas (debería ser muy largo en sistemas de 64 bits) y solo espera que pase los argumentos correctos. Es posible que deba verificar el contenedor CDLL en este caso ...

Además de todo lo anterior, se puede implementar rápidamente un rastreador ad hoc a través de módulo de rastreo .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top