J'utilise le Pydev pour le plug-in Eclipse et j'essaie de définir un point de rupture dans un code qui est exécuté dans un fil d'arrière-plan. Le point de rupture n'est jamais touché même si le code est en cours d'exécution. Voici un petit exemple:
import thread def go(count): print 'count is %d.' % count # set break point here print 'calling from main thread:' go(13) print 'calling from bg thread:' thread.start_new_thread(go, (23,)) raw_input('press enter to quit.')
4 Réponses :
Le problème sous-jacent est avec SyS.SetTrace a >, la fonction Python de bas niveau utilisée pour effectuer tous les traçages et le débogage - comme le disent les documents, P>
La fonction est spécifique au fil; pour un
débogueur pour soutenir plusieurs threads,
Il doit être enregistré à l'aide de Settrace ()
pour chaque fil étant débogué. p>
blockQuote>
Je pense que lorsque vous définissez un point d'arrêt dans pydev, l'appel "CODE> SETTRACE CODE> SEETTRACE " résultant se produit toujours sur le thread principal (je n'ai pas regardé à Pydev récemment, ils ont donc pu ajouter un moyen de contourner cela, mais je ne me souviens pas de l'époque où je l'ai regardé). P>
Une solution de contournement que vous pourriez mettre en œuvre est, dans votre thread principal après que le point d'arrêt a été défini, utiliser sys.gettrace pour obtenir la fonction de trace de Pydev, enregistrez-la dans une variable globale et assurez-vous dans tous les threads d'intérêt d'appeler
sys.settrace code> Avec cette variable globale comme argument - un peu encombrant (plus pour les threads qui existent déjà au moment où le point d'arrêt est défini!), mais je ne peux pas penser à une alternative plus simple. P>
Cela fonctionne parfois. On dirait que je dois appeler le SyS.SetTrace () dans un cadre de pile différent de l'endroit où se trouve le point de rupture. Je n'ai pas enquêté pleinement, mais cela fonctionne assez bien pour moi. Merci.
@Don, vous êtes la bienvenue - Je suppose que la fonction de traçage de Pydev doit être responsable de ce problème de "trame différent" (bien que ce ne soit pas évident exactement comment - il existe certaines possibilités, mais même la découverte probablement ne pourrait pas aider à résoudre) , mais quand même je suis content que cela puisse travailler pour vous. Assurez-vous d'ajouter une demande de fonctionnalité pour «Breaker dans n'importe quel fil» sur le suivi de Pydev afin qu'ils sait que c'est souhaité!
sur Cette question , J'ai trouvé un moyen de démarrer le débogueur de ligne de commande:
import pdb; pdb.set_trace()
Le problème est qu'il n'y a pas d'API dans le module de thread pour savoir quand un thread commence.
Ce que vous pouvez faire dans votre exemple est défini sur la fonction de trace de débogueur vous-même (comme Alex pointé) que dans le code ci-dessous (si Vous n'êtes pas dans le débogueur à distance, le pydevd.connected = True est actuellement requis - je changerai Pydev afin que cela ne soit plus nécessaire). Vous voudrez peut-être ajouter un essai..except Importerror pour l'importation PYDEVD (qui échouera si vous n'exécutez pas dans le débogueur) P>
def Go (compte): p>
import pydevd pydevd.connected = True pydevd.settrace(suspend=False) print 'count is %d.' % count # set break point here
Hé, c'est une bonne nouvelle! Merci pour la nouvelle fonctionnalité.
Étonnamment, j'ai le même problème dans Pydev 2.6. J'ai une application d'interface graphique où la classe A commence la classe B (qtcore.qthread) et le débogueur ne s'arrête pas dans les méthodes B, tandis que le code est exécuté. Si j'essaie d'entrer dans le b.start () appeler le débogueur m'envoie à la fin de " Main B>" Construire
Je ne peux pas résoudre le pydevd (python 2.7) de sorte que ce travail autour n'est pas pour moi
Pydevd est à Eclipse / Plugins / org.python.pydev_xxx / PYSRC. Vous devez l'ajouter à votre PythonPath - dans les dernières versions de Pydev, il y a un modèle 'PYDEVD' qui l'ajoutera à votre chemin ainsi que de faire la configuration.
@Fabio, j'utilise PYDEV 3.9 et ne constate pas à voir des points d'arrêt dans les threads de fond créés avec le filetage. J'ai encore besoin d'utiliser pydevd.settrace (suspendre = faux) code> pour obtenir le fonctionnement. Si votre correctif a également été recouvert de threads créés avec une filetage (vs thread)?
Pour moi, cela a fonctionné selon l'un des messages de Fabio, après avoir défini la trace avec settrace ("000.000.000.000.000") # où 0 sont l'adresse IP de votre ordinateur exécutant Eclipse / Pydev
threading.settrace(pydevd.GetGlobalDebugger().trace_dispatch)
Ça marche !! Merci je suis vraiment surpris du petit nombre de postes sur Pydevd.