2010-01-06 10 views
5

Mi aplicación se bloqueó recientemente en la computadora de un cliente. Sospecho que es debido a la administración de memoria propia de PyQt, que puede llevar a accesos de memoria no válidos cuando no se maneja correctamente.¿Puedo averiguar dónde se colgó una aplicación de Python utilizando el volcado de datos?

Cuando Python falla de esta manera, no se imprime ninguna traza inversa, solo se escribe un volcado de datos en el disco.

¿Existe la posibilidad de averiguar en qué parte del código de Python se produjo el bloqueo?

Aquí está el vertedero: http://pastie.org/768550

Respuesta

6

¿Es este un núcleo Linux volcado? Si es así, puedes examinarlo con gdb. Tendrá que ejecutar en un sistema con un sistema operativo idéntico y una versión de Python, incluidas las bibliotecas de terceros. Ejecute gdb -c /path/to/core/file. Una vez que gdb se haya cargado, el comando bt mostrará el seguimiento de la pila para el hilo principal, y thread apply all bt mostrará el seguimiento de la pila para todos los hilos.

Lo útil que esto dependerá de si la versión de Python incluye la tabla de símbolos completa (es decir, es una versión de depuración de Python); si no lo es, solo verá las direcciones como desplazamientos a los principales puntos de entrada C. . Sin embargo, esto puede ser útil para diagnosticar lo que salió mal.

Si es algún otro sistema operativo que no es compatible con gdb, entonces usted está solo, es de suponer que el sistema operativo tendrá sus propias herramientas de depuración.

Editar:

Hay una página en el wiki de Python que describe how to get a python stack trace with gdb.

Sin embargo, un vistazo rápido al enlace en la pregunta muestra que el sistema operativo es Windows, por lo que gdb no sirve de nada. La información en el volcado de Windows es mínima, así que creo que no tienes suerte.

Mis únicas sugerencias son:

  1. trate de reproducir el accidente en la casa.

  2. hacer que el usuario reproduzca el error mientras ejecuta una herramienta que atrapará el bloqueo y realizará un volcado de memoria adecuado. Hace aproximadamente una década que hice una seria depuración de Windows, así que no sé qué herramientas están disponibles ahora, antes había una llamada Dr.Watson, pero podría estar obsoleta.

Si el usuario no puede reproducir el accidente entonces usted está fuera de suerte, por el contrario, si nunca vuelva a suceder en realidad no es un problema tan grande. ;-)

Actualización:

Google me dice que el Dr. Watson sigue siendo el manejador de errores por defecto en Windows XP (y presumiblemente otras versiones de Windows) - el volcado de pila que estaba vinculada en la pregunta probablemente vino de eso. Sin embargo, los datos predeterminados guardados por el Dr. Watson son bastante mínimos, pero puede configurarlos para ahorrar más; consulte this article. En resumen, si ejecuta drwtsn32 -i, aparecerá un cuadro de diálogo que le permitirá configurar las opciones.

+0

no, no Linux seguro (mira la lista de procesos en el volcado: P) – shylent

+0

Estaría realmente interesado en un _Python_ backtrace, que no puedo obtener usando gdb, creo. (Creo que es posible simbolizar el volcado.) –

+0

Ya intenté reproducirlo en la máquina del usuario, no funcionó. Quiero decir que hay un cambio de 0.0000001% de que la memoria del usuario está dañada o Windows está estropeado. –

0

¿Su aplicación produce un registro? Si es así, puede hacer que el registro produzca un registro en memoria que pueda encontrar dentro del volcado del núcleo.Además, puede hacer que le envíen el archivo de registro en sí en su lugar del volcado del núcleo.

1

Hay un archivo llamado gdbinit en el árbol fuente de Python (en Misc/gdbinit) que proporciona un conjunto de macros para gdb para mostrar el contexto actual del intérprete. Simplemente escriba source gdbinit en gdb y luego puede ejecutar macros como pystack. La lista de macros disponibles se puede obtener simplemente leyendo el código fuente del archivo. (puede encontrarlo directamente aquí: http://svn.python.org/view/python/trunk/Misc/gdbinit?view=log).

Por supuesto, si el bloqueo es tan grave que ha dañado las estructuras internas del intérprete, las macros pueden fallar o bloquearse. Además, es mejor compilar el intérprete en modo de depuración, de lo contrario, gdb puede no ubicar los símbolos y variables necesarios.

1

No estoy seguro de si ayuda, pero si puede detectar la excepción, puede usar http://github.com/gooli/pydump para almacenar un volcado y cargarlo más tarde en un depurador de Python.

Cuestiones relacionadas