2010-08-05 2 views
8

J'essaie de déboguer Python en utilisant WinPDB et j'ai plusieurs threads en utilisant threading.Thread. Je n'arrive jamais à contrôler les fils individuellement. Si je casse l'exécution, le script entier se brise. Si je parcours le code source d'un thread, tous les autres continuent d'être entrelacés et continuent une partie de leur exécution. Cela est vrai avec Synchronicity activé ou désactivé. N'y a-t-il pas un moyen de franchir un fil individuellement tout en gardant les autres à un point d'arrêt?Comment parcourir les threads Python indépendamment? (WinPDB)

WinPDB est-il le mauvais outil à utiliser pour cela? Je ne sais pas quoi utiliser. Eclipse PyDev fonctionne à peine parce que le débogueur lui-même semble avoir des erreurs de course lors du démarrage de plusieurs threads.

Qu'est-ce qu'un outil réellement déboguer un programme Python multithread?

Merci.

+0

pdb ne prend pas en charge le débogage des programmes multithread. Cela devrait fonctionner avec PyDev cependant. Quel problème rencontrez-vous? –

Répondre

1

J'ai eu un problème similaire, ce n'est pas la réponse la plus idéale, mais je vais le décrire pour vous et peut-être que vous pouvez en tirer parti. J'ai plus ou moins écrit un mini débogueur. Udp Client/Serveur et une fonction qui n'a fait que capturer un verrou global, dormez .1 secondes, puis relâchez-le. Cette fonction a été transmise à chaque thread. J'ai ensuite mis un appel à cette fonction entre les zones critiques que je voulais déboguer. Après le démarrage du programme, le serveur udp écouterait le client, et si je tapais "pause", il saisirait le même verrou global utilisé par la fonction partagée, et ne l'abandonnerait pas jusqu'à ce que je tape "jouer" dans le client. Ce faisant, vous pouvez obtenir un arrêt assez serré ... en fonction de l'application.

Espérons que ça aide ... Petit extrait ci-dessous. Mon application était pour une plate-forme de test, ce que j'ai fait a été d'ajouter le pointeur de fonction au constructeur de la classe de base, et d'utiliser ceci à la place de time.sleep() .. me donnant un débugability doux. Ce que vous pouvez faire est de passer cela à chaque thread et d'ajouter des appels à la fonction pause au début et à la fin de vos fonctions, et cela vous permettra de casser, etc. J'ai supprimé certaines commandes, mais vous pouvez voir que cela peut être fait aussi vaste que vous en avez besoin.

PAUSE_NOW  = thread.allocate_lock() 
def pause(s): 
''' 
    FUNCTION: testStatus 

    DESCRIPTION: function passed to all test objects 

    INPUTS: none 

    RETURNS: none 
''' 
    global Pause_NOW 
    PAUSE_NOW.acquire() 
    time.sleep(s) 
    PAUSE_NOW.release() 

`

def server(): 
    ''' 
     \r\n 
     FUNCTION: server 

     DESCRIPTION: UDP server that launches a UDP client. The client it 
        starts can issue commands defined in cmdlineop. Most 
        functions return a status, but some are meant to block 
        the main thread as a means of pausing a test, in which case 
        a default response is returned. 

     INPUTS: none 

     RETURNS: none 
    ''' 
    global EXIT 
    global Pause_NOW 

    host = "localhost" 
    port = 21567 
    buf = 1024 
    addr = (host,port) 

    UDPSock = socket(AF_INET,SOCK_DGRAM) 
    UDPSock.bind(addr) 
    sleep(1) 
    os.startfile('client.py') 
    #os.system('start python client.py') 
    cmdlineop = { 
        'pausenow' : "PAUSE_NOW.acquire()", 
        'playnow' : "PAUSE_NOW.release()", 
       } 
    while 1: 
     output = 'RECEIVED CMD' 
     # if EXIT: break 
     data,addr = UDPSock.recvfrom(buf) 
     if not data: 
      break 
     else: 
      if cmdlineop.has_key(data.split()[0]): 
       exec(cmdlineop[(data.split()[0])]) 
       UDPSock.sendto(('\n'+output+'\n'),addr) 
       data = '' 
      else: 
       UDPSock.sendto('INVALID CMD',addr) 
    UDPSock.close() 
+0

Je ne comprends pas complètement ce que le premier répondeur faisait avec ce client/serveur UDP. PyDev ne fonctionne pas car il obtient ces erreurs bizarres avec un fichier XML que le débogueur essaie d'écrire avec des informations d'état. Peut-être qu'il a plusieurs threads essayant d'écrire dans le fichier en même temps lors de l'exécution d'un programme multithread, et n'est pas configuré pour gérer cela. – MMM

+0

désolé, jamais utilisé pyDev – pyInTheSky

Questions connexes