7
votes

Obtenez StackTrace du processus de python coincé qui n'accepte pas les signaux

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é.

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 sigkill .

Y a-t-il une autre possibilité de déterminer où exactement le processus est quand il est bloqué?


1 commentaires

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


6 Réponses :


1
votes

Vous pouvez essayer de joindre un débogueur au processus de course. Voir aussi Cette question .


0 commentaires

0
votes

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.

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.


0 commentaires

2
votes

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.

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!


0 commentaires

0
votes

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 / usr / bin / python -p $ pid' - Le nom de l'exécutable est requis pour que GDB puisse trouver les fichiers d'informations de débogage corrects.


0 commentaires

9
votes

Vous pouvez imprimer une belle trace de pile à l'aide de pyrasite .

Tout d'abord, vous aurez besoin d'avoir GDB installé. p> xxx pré>

puis, installez pyrasite. p> xxx pré>

Utilisez 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> xxx pré>

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>

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


4 commentaires

Quand je fais cela, la pyrasite-shell est également suspendue


De même, la coquille pyrasite est suspendue


Vous devez exécuter pyrasite-shell 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



0
votes

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 pour déterminer ce qui s'est mal passé.

  • Attachez GDB au processus Python: gdb -p (peut avoir besoin sudo .) .)
  • Exécutez les fonctions suivantes en tapant les commandes dans gdb xxx

    Voir la documentation de l'API Python pour les fonctions: 1 2 .


    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:

    Reportez-vous à la source Python Code https://github.com/python/cpython /blob/4fe5585240f64c3d14EB635FF82B163F92074B3A/include/pytstate.h#l86-l88 , type pygilstate_state est une énumération avec 2 valeurs, donc nous "devinons" que nous pouvons utiliser int < / code>. ( Bien que cela puisse ne pas fonctionner. )

    en conclusion, selon la documentation, le "correct (Sous réserve de la restriction ci-dessus) "Les commandes des fonctions sont xxx


    Cette solution ne s'appuie pas sur l'extension de python-débogage pour GDB. Sinon, il est possible de simplement exécuter py-bt .


    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.


0 commentaires