Puis-je savoir où se trouve une application en Python s'est écrasé en utilisant les données de vidage?
Ma demande s'est écrasé récemment sur l'ordinateur d'un client. Je soupçonne que c'est parce que de PyQt propres à la gestion de la mémoire, ce qui peut conduire à un invalide les accès à la mémoire lorsqu'il n'est pas géré correctement.
Quand Python se bloque comme ça, pas de traces sont imprimées, seulement un vidage des données sont écrites sur le disque.
Est-il possible de savoir où dans le code Python de la collision s'est produite?
Voici le dump: http://pastie.org/768550
OriginalL'auteur Georg Schölly | 2010-01-06
Vous devez vous connecter pour publier un commentaire.
Est-ce un linux core dump? Si oui, vous pouvez les examiner avec gdb. Vous aurez besoin pour s'exécuter sur un système avec un nombre identique de l'OS et la version de Python, notamment la 3ème partie des bibliothèques. Exécuter
gdb -c /path/to/core/file
. Une fois gdb a chargé la commandebt
liste la trace de la pile pour le thread principal, etthread apply all bt
liste la trace de la pile pour tous les threads.L'utilité de cette fonction sera dépend de la version de Python inclut la totalité de la table des symboles (c'est à dire une version de débogage de Python) - si elle ne l'est pas, alors vous ne verrez que des adresses, des compensations pour des le principal C les points d'entrée. Cependant, il peut encore être de quelque utilité dans le diagnostic de ce qui s'est passé.
Si c'est un autre système d'exploitation qui ne prend pas en charge gdb alors vous êtes sur votre propre, probablement le système d'exploitation doit disposer de ses propres outils de débogage.
Edit:
Il y a une page sur le wiki Python décrivant comment obtenir un python trace de la pile à l'aide de gdb.
Cependant un rapide coup d'oeil sur le lien dans la question montre que le système d'exploitation est Windows, donc gdb est d'aucune utilité. Les informations dans les Fenêtres de vidage est minime, de sorte que je pense que vous êtes hors de la chance.
Mes seuls suggestions:
essayez de reproduire le crash de dans-maison.
amener l'utilisateur à reproduire le bug lors de l'exécution d'un outil de capture de l'accident, et faire un bon vidage de la mémoire. Il s'agit d'une décennie depuis que j'ai fait de sérieuses de débogage de windows donc je ne sais pas quels sont les outils disponibles maintenant - il utilisé pour être l'un appelé le Dr Watson, mais il peut être obsolète.
Si l'utilisateur ne peut pas reproduire le crash, alors vous êtes hors de la chance, d'autre part, si il n'arrive jamais encore, il n'est pas vraiment un gros problème. 😉
Mise à jour:
Google me dit que le Dr Watson est toujours le crash handler par défaut sur Windows XP (et probablement d'autres versions de Windows) - le vidage de pile qui était lié à la question est probablement venu de lui. Toutefois, le défaut de données enregistrées par le Dr Watson est assez minime, mais vous pouvez le configurer pour enregistrer des plus - voir cet article. En bref, si vous exécutez
drwtsn32 -i
il fera apparaître une boîte de dialogue vous permet de définir les options.Je serais vraiment intéressé par un Python backtrace, je ne peux pas obtenir à l'aide de gdb, je pense. (Symbolisant la décharge devrait être possible je pense.)
J'ai déjà essayé de le reproduire sur la machine de l'utilisateur, n'a pas fonctionné. Je veux dire, il y a un changement de 0.0000001% que la mémoire de l'utilisateur est endommagé ou Windows vissé vers le haut.
Je ne sais rien à propos de Dr Watson, mais à partir de la liste des processus, il semble bien que cela ait été en cours d'exécution?
L'ordinateur est configuré pour stocker les données minimales de vidage (64 ko), je suppose que je ne devrais pas jouer avec ces paramètres. En outre, je ne pense pas que j'ai une grande chance d'obtenir quelque chose d'utile à partir de ce minimum de la pile. Je suppose que je vais juste attendre que cela se produise à nouveau et essayez de la reproduire.
OriginalL'auteur Dave Kirby
Il y a un fichier nommé
gdbinit
dans la source Python arbre (enMisc/gdbinit
) qui fournit un ensemble de macros pour gdb pour afficher le courant interprète contexte. Tapez simplementsource gdbinit
dans gdb et ensuite, vous pouvez exécuter des macros telles quepystack
. La liste des macros disponibles peut être obtenue simplement par la lecture du fichier de code source.(vous pouvez le trouver directement ici: http://svn.python.org/view/python/trunk/Misc/gdbinit?view=log).
Bien sûr, si l'accident est si grave qu'il a corrompu l'interprète structures internes, les macros peuvent échouer ou de collision. Aussi, il est préférable de compiler l'interpréteur en mode debug, sinon gdb peut ne parviennent pas à localiser les symboles et les variables.
OriginalL'auteur Antoine P.
Ne sais pas si ça aide, mais si vous pouvez intercepter l'exception, vous pouvez utiliser http://github.com/gooli/pydump pour stocker un cliché et de le charger plus tard dans un Python débogueur.
OriginalL'auteur gooli
Votre demande de produire un journal? Si oui, vous pouvez disposer de journalisation de produire un mémoire de journal qui vous pourriez être en mesure de trouver au sein de la core dump. Aussi, vous pouvez leur demander de vous envoyer le fichier journal lui-même au lieu de la core dump.
OriginalL'auteur S.Lott