Comment puis-je vider un processus Python entier pour une inspection de débogage ultérieure?
Question
J'ai une application Python dans un état étrange. Je ne veux pas faire de débogage en direct du processus. Puis-je le transférer dans un fichier et examiner son état ultérieurement? Je sais que j'ai restauré des corefiles de programmes C dans gdb plus tard, mais je ne sais pas comment examiner une application Python de manière utile à partir de gdb.
(Ceci est une variante de ma question sur débogage de mèmes dans un système de production .)
La solution
Il n'y a pas d'autre moyen intrinsèque que d'abandonner (avec os.abort (), provoquant le vidage de mémoire si les ressources le permettent) - bien que vous puissiez certainement créer votre propre fonction de "vidage" qui draine les informations pertinentes sur les données dont vous vous occupez sur. Il n’existe aucun outil prêt à l’emploi.
En ce qui concerne le fichier core d’un processus Python, la la source Python a une fichier gdbinit contenant des macros utiles. C’est toujours beaucoup plus pénible que de pénétrer d’une manière ou d’une autre dans le processus lui-même (avec pdb ou l’interprète interactif), mais cela simplifie un peu la vie.
Autres conseils
Un membre de la hiérarchie supérieure a déclaré qu’il n’existait pas de méthode intégrée, mais ce n’était pas tout à fait vrai. Pour un exemple, vous pouvez regarder les outils de débogage de pylônes. Lorsqu'il y a une exception, le gestionnaire d'exceptions enregistre la trace de la pile et imprime une URL sur la console qui peut être utilisée pour récupérer la session de débogage via HTTP.
Même s'ils gardent probablement ces sessions en mémoire, ce ne sont que des objets en python. Par conséquent, rien ne vous empêche de choisir un vidage de pile et de le restaurer ultérieurement pour inspection. Cela signifierait quelques changements dans l'application, mais cela devrait être possible ...
Après quelques recherches, il s’avère que le code approprié provient réellement de Module EvalException . Vous devriez pouvoir y chercher ce dont vous avez besoin.
Cette réponse suggère de créer le dump principal de votre programme, puis de poursuivre l'exécution sur une autre boîte suffisamment similaire.
Il est également possible d'écrire quelque chose qui viderait toutes les données du processus, par exemple.
- Pickler qui ignore les objets qu'il ne peut pas pickler (en les remplaçant par autre chose) (par exemple, Python: Choisir un dict avec certains éléments impicklables )
- Méthode qui convertit de manière récursive tout ce qui est sérialisable (par exemple, , sauf qu'il a besoin d'une vérification pour les objets qui se répètent à l'infini et de faire quelque chose avec ceux-ci; il pourrait également essayer
dir ()
etgetattr ()
pour traiter une partie de la objets inconnus, par exemple des classes d'extension).
Mais laisser un processus en cours d'exécution avec un trou d'homme ou des pylônes ou quelque chose du genre semble certainement plus pratique lorsque cela est possible.
(aussi, je me demande si quelque chose de plus pratique a été écrit depuis que cette question a été posée pour la première fois)