Je dois exécuter un site Web Legacy Zope2 et avoir un grief avec cela. Le plus gros problème est que, de temps en temps, il est juste de se bloquer, fonctionnant à 100% de charge de la CPU et ne répond plus aux demandes. Bien que le problème ne soit pas reproductible de manière régulière, une page contenant 3 graphiques dynamiques le déclenche parfois, donc je soupçonne une sorte de condition de race qui conduit à une boucle sans fin ou à un wait bloqué. P>
Le problème est que je n'ai pas encore trouvé de 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 une stacktrace, Mais le seul signal qui a tout effet est Y a-t-il une autre possibilité de déterminer où exactement le processus est quand il est bloqué? P> sigkill code>. p>
6 Réponses :
Vous pouvez essayer de joindre un débogueur au processus de course. Voir aussi Cette question . p>
Si le processus est bloqué de manière à ce qu'aucun autre signal ne traverse, vous voudrez peut-être envisager de l'exécuter à partir d'un débogueur, au lieu d'essayer de l'attacher au moment de l'exécution. P>
En outre, il peut être utile d'autres tactiques de débogage, comme éteindre certaines parties du code pour connaître le cas minimal dans lequel il est toujours reproductible afin de voir ce qui le fait mieux. P>
voir ma réponse à Cette question à ce sujet , utilisez Produits.SignalStack . Il enregistre le même gestionnaire que la réponse que vous avez déjà trouvée, au moment de l'inscription du produit. Peut-être cela fonctionne-t-il mieux pour vous. P>
Sinon, vous avez probablement un problème d'E / S au niveau du système d'exploitation sur vos mains, et votre seul espoir est de joindre GDB au processus. Overflow de pile de recherche pour les réponses de GDB; Il y a une richesse d'informations ici! P>
Après avoir couru sur Internet en cercles pendant un moment, j'ai finalement fini ici: http://podoliaka.org/2016/04/10/debugging-cpython-gdb/ - décrit en détail comment toutes les pièces correspondent ensemble. La citation de l'argent pour moi était 'gdb
Vous pouvez imprimer une belle trace de pile à l'aide de pyrasite .
Tout d'abord, vous aurez besoin d'avoir GDB installé. p> puis, installez pyrasite. p> Utilisez Vous devez maintenant voir un Python Rep. Exécutez ce qui suit dans le repli à voir les traces de pile pour toutes les filetages. P> PS code> ou une autre méthode Pour trouver l'ID de processus pour le processus de python coincé et exécuter
pyrasite-shell code> avec elle. p>
import sys, traceback
for thread_id, frame in sys._current_frames().items():
print 'Stack for thread {}'.format(thread_id)
traceback.print_stack(frame)
print ''
Quand je fais cela, la pyrasite-shell est également suspendue
De même, la coquille pyrasite est suspendue
Vous devez exécuter pyrasite-shell code> avec le propriétaire de processus
(Disclaimer: Mon colis) La pyrasite a un ou deux bugs qui pourrait le faire accrocher. J'ai une fourchette pyrasite-ng qui corrige certains de ces bugs
tandis que la pyrasite pourrait fonctionner, il ne gère pas certains cas d'angle et blanchit / échoue silencieusement.
Si l'emballage ne fonctionne pas comme prévu, il est possible de faire ce que le paquet fait sous la hotte manuellement em> pour déterminer ce qui s'est mal passé. p> Voir la documentation de l'API Python pour les fonctions: 1 2 . P> Si Python n'est pas compilé avec des symboles de débogage, il est nécessaire de fournir les types de données explicites pour les fonctions: p> Reportez-vous à la source Python Code https://github.com/python/cpython /blob/4fe5585240f64c3d14EB635FF82B163F92074B3A/include/pytstate.h#l86-l88 , type en conclusion, selon la documentation, le "correct (Sous réserve de la restriction ci-dessus) "Les commandes des fonctions sont p> Cette solution ne s'appuie pas sur l'extension de python-débogage pour GDB. Sinon, il est possible de simplement exécuter J'ai une fourchette plus à jour de la pyrasite (actuellement) nommée pyrasite-ng. S'il y a un bug qu'il peut être signalé là-bas, j'espère que je puisse le réparer rapidement. P> p>
gdb -p
sudo code>.) li>.)
pygilstate_state code> est une énumération avec 2 valeurs, donc nous "devinons" que nous pouvons utiliser
int < / code>. ( Bien que cela puisse ne pas fonctionner. ) p>
py-bt code>. P>
Remarque: cette question aborde le cas spécifique. Dans d'autres cas, la question générale est Débogage - montrant la trace de la pile de Une application Python en cours d'exécution - Overflow de pile