¿Cómo vuelco un proceso completo de Python para depurar más tarde la inspección?

Tengo una aplicación de Python en un estado extraño. No quiero hacer la depuración en vivo del proceso. ¿Puedo volcarlo en un archivo y examinar su estado más adelante? Sé que he restaurado los archivos core de los progtwigs de C en gdb más tarde, pero no sé cómo examinar una aplicación de Python de una manera útil desde gdb.

(Esta es una variación de mi pregunta sobre la depuración de memleaks en un sistema de producción ).

No hay otra forma integrada que no sea abortar (con os.abort (), que provoca el volcado de fondo si los límites de recursos lo permiten), aunque ciertamente puede crear su propia función de ‘volcado’ que descarga información relevante sobre los datos que le interesan. No hay herramientas preparadas para ello.

En cuanto al manejo del archivo de núcleo de un proceso de Python, la fuente de Python tiene un archivo gdbinit que contiene macros útiles. Sigue siendo mucho más doloroso que entrar en el proceso en sí mismo (con pdb o el intérprete interactivo) pero hace la vida un poco más fácil.

Alguien de arriba dijo que no hay una forma integrada de realizar esto, pero eso no es del todo cierto. Por ejemplo, puede echar un vistazo a las herramientas de depuración de los pilones. Cuando hay una excepción, el controlador de excepciones guarda el seguimiento de la stack e imprime una URL en la consola que se puede usar para recuperar la sesión de depuración a través de HTTP.

Si bien es probable que mantengan estas sesiones en la memoria, solo son objetos de Python, por lo que no hay nada que le impida tomar un volcado de stack y restaurarlo más tarde para su inspección. Significaría algunos cambios en la aplicación, pero debería ser posible …

Después de algunas investigaciones, resulta que el código relevante proviene realmente del módulo EvalException de Paste. Debes poder mirar allí para descubrir lo que necesitas.

Esta respuesta sugiere hacer el volcado del núcleo de su progtwig y luego continuar la ejecución en otro cuadro suficientemente similar.

También es posible escribir algo que volcaría todos los datos del proceso, por ejemplo,

  • Pickler que ignora los objetos que no puede encurtir (reemplazándolos con otra cosa) (p. Ej., Python: Decapado de un dictado con algunos elementos que no se pueden recoger )
  • Método que convierte todo de forma recursiva en material serializable (por ejemplo, este , excepto que necesita una comprobación de objetos recurrentes infinitos y hacer algo con ellos; también podría probar dir() y getattr() para procesar algunos de los objetos desconocidos, por ejemplo, clases de extensión) .

Pero dejar un proceso en ejecución con pozo o pilones o algo así parece ciertamente más conveniente cuando es posible.

(también, me pregunto si se escribió algo más conveniente desde que se hizo esta pregunta por primera vez)