Comment puis-je dire d'où mon script python est suspendu?
Donc, je suis le débogage mon programme en python et ont rencontré un bug qui fait que le programme pendre, comme si dans une boucle infinie. Maintenant, j'ai eu un problème avec une boucle infinie avant, mais quand il a raccroché, je pouvais tuer le programme python et recraché un utile exception qui m'a dit où le programme fin quand je l'ai envoyé la commande kill. Maintenant, cependant, lorsque le programme se bloque et je ctrl-c, on ne va pas abandonner, mais continue de courir. Est-il un outil que je peux utiliser pour localiser l'accrocher? Je suis nouveau sur le profilage mais d'après ce que je sais un profileur ne peut vous fournir de l'information sur un programme qui a complété avec succès. Ou pouvez-vous utiliser un profiler pour déboguer tel hang ups?
- Comment savez-vous qu'il est dans une boucle? Est un PROCESSEUR fixé à 100%? Si non, ça pourrait être dans une prise d'attente (en supposant que c'est de faire des e/S réseau).
- Si elle ne répond pas à Ctrl+C, ce pourrait être parce que la
KeyboardInterrupt
exception est pris à un certain point. Si vous avez untry: ... except:
clause qui n'a pas de nom spécifique des classes d'exception, qui pourrait être responsable. - J'ai exactement le même problème et Ctrl+C ne fonctionne pas car il se bloque à l'intérieur d'un C-appeler quelque part. Mon CPU est à 100%.
Vous devez vous connecter pour publier un commentaire.
Supposons que vous exécutez votre programme:
Essayez d'exécuter votre programme:
Et avoir de la patience alors que beaucoup de choses est imprimé sur l'écran. Si vous avez une boucle infinie, il sera pour toujours (problème de l'arrêt). Si ça coince quelque part, alors la plupart du temps vous êtes coincé sur les I/O ou c'est une impasse.
Wow! 5 réponses déjà et personne n'a suggéré la plus évidente et la plus simple:
print "**010"
,print "**020"
, etc. parsemées à travers les grands domaines.Enfants ces jours-ci avec leur fantaisie débogueurs & IDEs... Parfois, l'ingénierie, les problèmes sont résolus plus simplement avec des outils primitifs, qui fournissent un peu plus d'informations.
Si votre programme est trop gros et trop complexe pour être viable pour le pas à pas avec apb ou de l'impression de chaque ligne avec la trace du module, alors vous pourriez essayer un truc de mes jours de 8-bit jeux de programmation. À partir de Python 2.5 à partir de l'apb a la capacité d'associer le code avec un point d'arrêt à l'aide de la
commands
de commande. Vous pouvez utiliser cette option pour imprimer un message et poursuivre l'exécution:Ce affichera un message et d'effectuer en cours d'exécution lorsque le point d'arrêt 1 frappe. Définir des commandes similaires pour quelques autres points d'arrêt.
Vous pouvez l'utiliser pour faire une sorte de recherche binaire de votre code. Fixez les points d'arrêt aux endroits clés dans le code et l'exécuter jusqu'à ce qu'il se bloque. Vous pouvez dire à partir du dernier message qui a été le dernier point d'arrêt il est frappé. Vous pouvez ensuite déplacer les autres points d'arrêt et de ré-exécuter pour affiner l'endroit dans le code où il se bloque. Rincer et répéter.
Incidemment, sur les 8 bits micros (Commodore 64, Spectrum, etc), vous pouvez piquer une valeur dans un registre de localisation de changer la couleur de la bordure autour de l'écran. J'ai utilisé à quelques points d'arrêt pour ce faire avec des couleurs différentes, de sorte que lorsque le programme est exécuté, il donnerait un arc-en-ciel psychédélique écran jusqu'à ce qu'il pendait, la frontière se changerait en une seule couleur qui vous dit ce que le dernier point d'arrêt a été. Vous pouvez également obtenir une bonne idée de la performance relative des différentes sections de code par la quantité de chaque couleur de l'arc-en-ciel. Parfois je m'ennuie de la simplicité de ces nouvelles ultramodernes "Windows" machines.
J'ai écrit un module qui permet d'afficher fils qui pendent plus de 10 secondes à un endroit.
hanging_threads.py
Voici un exemple de sortie:
Cela se produit à la sortie du thread principal lorsque vous oubliez de définir un autre thread que daemon.
Il est plus facile de prévenir ces hang-ups que c'est à déboguer.
Première:
for
boucles sont très, très difficile à obtenir coincé dans une situation où la boucle ne sera pas résilié. Très dur.Deuxième:
while
boucles sont relativement faciles à obtenir coincé dans une boucle.La première étape est de vérifier tous les
while
boucle pour voir si il doit être unwhile
boucle. Souvent, vous pouvez remplacerwhile
avec des constructions defor
, et vous pourrez corriger votre problème en repensant votre boucle.Si vous ne pouvez pas remplacer un
while
boucle avecfor
, puis il vous suffit de prouver que l'expression dans lewhile
déclaration doit de changer à chaque passage dans la boucle. Ce n'est pas que difficile à prouver.Regardez tous les condition dans la boucle. Appel ce T.
Regardez toutes les branches logiques dans le corps de la boucle. Est-il possible de passer à travers la boucle sans un changement d'état, T?
Oui? C'est un bug. Cette logique chemin est mauvais.
Pas? Excellente, cette boucle doit mettre fin.
Si votre programme est un peu trop complexe pour être simplement la trace de toutes les fonctions, vous pouvez essayer de l'exécuter manuellement et de fixation d'un traceur programme comme lptrace à elle. Il fonctionne un peu comme
strace
– elle imprime à chaque appel de fonction de votre programme fait. Voici comment l'appeler:Noter que lptrace nécessite gdb pour les exécuter.
Rien de tel que le bon vieux apb
Puis appuyez simplement sur (n) pour aller à la prochaine commande (s) à l'étape dans. voir la documentation pour la référence complète.
Suivez votre programme étape par étape, et vous aurez probablement comprendre assez vite.
Vous pouvez également essayer de http://code.activestate.com/recipes/576515-debugging-a-running-python-process-by-interrupting/ . Il devrait fonctionner aussi longtemps que le Python processus n'a pas de signaux masqués, qui est normalement le cas, même si Ctrl-C ne fonctionne pas.
Ne l'ai pas utilisé moi-même, mais j'ai entendu dire que le Eric IDE est bon et a un bon débogueur. C'est aussi le seul IDE je sais de qui a un débogueur pour Python
Si votre programme a plus d'un thread, il pourrait être ignorant ctrl-c, car le fil conducteur est connecté à la combinaison de touches ctrl-c gestionnaire, mais le live (runaway?) thread est sourd à elle. Le GIL (global interprète lock) dans Disponible signifie que normalement, un seul thread peut effectivement être en cours d'exécution à tout moment.
Je pense que j'ai résolu mon (peut-être) le même problème à l'aide de cette
Une fois que vous connaissez les noms des fils; début de la ré-exécution de votre script et le filtre vers le bas, ne pas s'arrêter d'être abandonnée. i=0 conditionnelle empêche le thread principal d'être abandonnée.
Je suggère d'aller à travers et à nommer toutes vos fils; tels que:
Thread(cible=auto.log_sequence_status, nom='journal le statut")
Ce code doit être placé à la fin du programme principal qui démarre le processus de
Wow ! Semble que vous avez ajouté tellement de code dans un aller sans le tester que vous ne pouvez pas dire quel est le code a été ajoutée juste avant le programme a commencé à accrocher... (la cause la plus probable du problème).
Au sérieux, vous devez le code par de petits pas et de tester chacun d'eux individuellement (idéalement faire TDD).
Pour votre problème exact de repérer ce que le code python est en cours d'exécution et ctrl-c ne fonctionne pas, je vais essayer un cru deviner: avez-vous utilisé des
except:
attraper toutes les exceptions indistinctement. Si vous l'avez fait dans une boucle (et continue la boucle après la gestion de l'exception), c'est très probablement la raison pour laquelle ctrl-c ne fonctionne pas : il est piégé par cette exception. Changement deexcept Exception:
et il ne devrait pas être atteint, plus il y a d'autres possibilités pour le ctrl+c ne fonctionne pas comme la gestion des threads comme une autre affiche a suggéré, mais je crois que la raison invoquée ci-dessus est plus probable).