Question

Je dois lancer un site Zope2 héritage et avoir un grief avec elle. Le plus gros problème est que, de temps en temps, il se bloque tout simplement, en cours d'exécution à la charge du processeur à 100% et ne pas répondre aux demandes plus. Bien que le problème n'est pas reproductible sur une base régulière, une page contenant 3 graphiques dynamiques déclenche parfois, je soupçonne une sorte de condition qui conduit à une boucle sans fin ou un busywait bloqué.

Le problème est, je ne l'ai pas encore trouvé un moyen de déboguer cette chose. Il n'y a rien dans les journaux Zope et rien dans les journaux du système. J'ai essayé les suggestions de cette question pour obtenir un stacktrace, mais le seul signal qui a un effet est SIGKILL.

Y at-il une autre possibilité de savoir où exactement le processus est quand il se coince?

Était-ce utile?

La solution

Si le processus est bloqué d'une manière qu'aucun autre signal passe à travers, vous pouvez envisager l'exécuter à partir d'un débogueur, au lieu d'essayer d'y attacher à l'exécution.

En outre, il peut être utile à d'autres tactiques de débogage, comme éteindre certaines parties du code pour savoir le cas minimal dans lequel il est encore reproductible afin de voir quelles sont les causes mieux.

Autres conseils

Vous pouvez imprimer une belle trace de la pile en utilisant pyrasite .

D'abord, vous aurez besoin d'avoir installé gdb.

# Redhat, CentOS, etc
$ yum install gdb

# Ubuntu, Debian, etc
$ apt-get update && apt-get install gdb

Ensuite, installez pyrasite.

$ pip install pyrasite

Utilisez ps ou une autre méthode pour trouver l'ID de processus pour le processus de python coincé et exécuter pyrasite-shell avec.

# Assuming process ID is 12345
$ pyrasite-shell 12345

Vous devriez maintenant voir un REPL python. Exécuter ce qui suit dans le REPL voir les traces de pile pour tous les sujets.

import sys, traceback
for thread_id, frame in sys._current_frames().items():
    print 'Stack for thread {}'.format(thread_id)
    traceback.print_stack(frame)
    print ''

Voir ma réponse à cette question SO , utilisez Products.signalstack . Il enregistre le même gestionnaire que la réponse que vous avez déjà trouvé, au moment de l'enregistrement du produit. Peut-être que cela fonctionne mieux pour vous.

Dans le cas contraire, vous avez probablement un problème d'E / S au niveau du système d'exploitation sur vos mains, et votre seul espoir est apposez gdb au processus. Rechercher Stack Overflow pour obtenir des réponses gdb; il y a une foule d'informations ici!

Vous pouvez essayer d'attacher un débogueur au processus en cours d'exécution. Voir aussi cette question .

après avoir couru autour de l'Internet en rond pendant un certain temps je me suis finalement fini par ici: http://podoliaka.org/2016/04/10/debugging-cpython-gdb/ - décrit en détail comment toutes les pièces se ensemble. la citation de l'argent pour moi était 'gdb / usr / bin / python -p $ PID' -. le nom de l'exécutable est nécessaire pour gdb pour trouver les fichiers d'information de débogage correct

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top