8
votes

Puis-je mettre des points de rupture sur les threads de fond en python?

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.')


0 commentaires

4 Réponses :


4
votes

Le problème sous-jacent est avec SyS.SetTrace , la fonction Python de bas niveau utilisée pour effectuer tous les traçages et le débogage - comme le disent les documents,

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

Je pense que lorsque vous définissez un point d'arrêt dans pydev, l'appel "CODE> SETTRACE SEETTRACE

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


2 commentaires

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



2
votes

sur Cette question , J'ai trouvé un moyen de démarrer le débogueur de ligne de commande:

import pdb; pdb.set_trace()


0 commentaires

10
votes

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


5 commentaires

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 " 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) pour obtenir le fonctionnement. Si votre correctif a également été recouvert de threads créés avec une filetage (vs thread)?



1
votes

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)


1 commentaires

Ça marche !! Merci je suis vraiment surpris du petit nombre de postes sur Pydevd.