Existe-t-il un moyen d'attacher un débogueur à un processus Python multithread ?

StackOverflow https://stackoverflow.com/questions/47701

  •  09-06-2019
  •  | 
  •  

Question

J'essaie de déboguer un blocage dans une application Python multithread après son blocage.Existe-t-il un moyen d'attacher un débogueur pour inspecter l'état du processus ?

Modifier:J'essaie cela sous Linux, mais ce serait formidable s'il existait une solution multiplateforme.C'est Python après tout :)

Était-ce utile?

La solution

Ouais, gdb est bon pour le débogage de niveau inférieur.

Vous pouvez changer de sujet avec le fil commande.

par exemple

(gdb) thr 2
[Switching to thread 2 (process 6159 thread 0x3f1b)]
(gdb) backtrace
....

Vous pouvez également consulter des débogueurs spécifiques à Python comme Winpdb, ou pydb.Les deux sont indépendants de la plateforme.

Autres conseils

Utiliser Winpdb.C'est un indépendant de la plateforme Débogueur graphique GPL Python avec prise en charge du débogage à distance sur un réseau, plusieurs threads, modification de l'espace de noms, débogage intégré, communication cryptée et est jusqu'à 20 fois plus rapide que pdb.

Caractéristiques:

  • Licence GPL.Winpdb est un logiciel libre.
  • Compatible avec CPython 2.3 à 2.6 et Python 3000
  • Compatible avec wxPython 2.6 à 2.8
  • Indépendant de la plateforme et testé sur Ubuntu Gutsy et Windows XP.
  • Les interfaces des utilisateurs:rpdb2 est basé sur une console, tandis que winpdb nécessite wxPython 2.6 ou version ultérieure.

Screenshot
(source: winpdb.org)

Vous pouvez attacher un débogueur à un processus Python multithread, mais vous devez le faire au niveau C.Pour donner un sens à ce qui se passe, vous avez besoin que l'interpréteur Python soit compilé avec des symboles.Si vous n'en avez pas, vous devez télécharger la source depuis python.org et la construire vous-même :

./configure --prefix=/usr/local/pydbg
make OPT=-g
sudo make install
sudo ln -s /usr/local/pydbg/bin/python /usr/local/bin/dbgpy

Assurez-vous que votre charge de travail s'exécute sur cette version de l'interpréteur.Vous pouvez ensuite vous y attacher avec GDB à tout moment.Les utilisateurs de Python ont inclus un exemple ".gdbinit" dans leur répertoire Misc, qui contient des macros utiles.Cependant, il est défectueux pour le débogage multithread (!).Vous devez remplacer les lignes comme celle-ci

while $pc < Py_Main || $pc > Py_GetArgcArgv

avec ce qui suit :

while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)

Sinon des commandes comme pystack ne se terminera pas sur des threads autres que le thread principal.Avec tout ça en place, vous pouvez faire des choses comme

gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach

et voyez ce qui se passe.Type de.

Vous pouvez analyser ce que sont les objets avec la macro "pyo". Chris a quelques exemples sur son blog.

Bonne chance.

(Cri pour Le blog de Dan pour quelques informations clés pour moi, notamment le correctif de threading !)

Si vous parlez du pydb, il n'y a aucun moyen de le faire.Des efforts ont été déployés dans ce sens :voir le commit svn, mais il a été abandonné.Soi-disant winpdb le supporte.

Mon expérience de débogage de programmes multithread dans PyDev (Eclipse sur Windows XP) est que les threads créés à l'aide de thread.start_new_thread ne pouvaient pas être accrochés, mais les threads créés à l'aide de threading.Thread pouvaient être accrochés.J'espère que les informations sont utiles.

Sur quelle plateforme essayez-vous cela ?La plupart des débogueurs vous permettent de vous attacher à un processus en cours d'exécution en utilisant l'identifiant du processus.Vous pouvez soit afficher l'identifiant du processus via la journalisation, soit en utilisant quelque chose comme le Gestionnaire des tâches.Une fois cet objectif atteint, il sera possible d'inspecter les threads individuels et leurs piles d'appels.

MODIFIER:Je n'ai aucune expérience avec GNU Debugger (GDB), qui est multiplateforme, mais j'ai trouvé ceci lien et cela peut vous mettre sur la bonne voie.Il explique comment ajouter des symboles de débogage (pratique pour lire les traces de pile) et comment demander à gdb de s'attacher à un processus Python en cours d'exécution.

pdbinject vous permet d'injecter pdb dans un processus python déjà en cours d'exécution.

L'exécutable pdbinject ne fonctionne que sous python2, mais peut également très bien s'injecter dans python3.

L'EDI PyCharm permet de s'attacher à un processus Python en cours d'exécution depuis la version 4.0.

Ici est décrit comment procéder.

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