2010-08-05 8 views
8

Estoy intentando depurar Python usando WinPDB y tengo varios hilos usando threading.Thread. Parece que nunca puedo controlar los hilos individualmente. Si rompo la ejecución, todo el guión se rompe. Si paso por el código fuente de un hilo, todos los demás continúan intercalados y continúan parte de su ejecución. Esto es así con Synchronicity activado o desactivado. ¿No hay una manera de atravesar un hilo individualmente mientras se mantienen a los demás en un punto de quiebre?¿Cómo pasar por los subprocesos de Python de forma independiente? (WinPDB)

¿Es WinPDB la herramienta incorrecta para usar para esto? Simplemente no sé qué usar. Eclipse PyDev apenas funciona porque el depurador parece tener errores de raza al iniciar varios subprocesos.

¿Qué es una herramienta que realmente robustamente depura un programa de múltiples hilos de Python?

Gracias.

+0

AP no admite la depuración de programas multihilo. Sin embargo, esto debería funcionar con PyDev. ¿Qué problema estás experimentando? –

Respuesta

1

Tuve un problema similar, no es la respuesta más ideal, pero lo describiré para ti y quizás puedas resolverlo.

Más o menos escribí un mini depurador. Udp Client/Server y una función que no hizo nada más que tomar un bloqueo global, dormir .1 segundos y luego soltarlo. Esta función pasó a cada hilo. Luego puse una llamada a esta función entre las áreas críticas que quería depurar. Después de iniciar el programa, el servidor udp escucharía al cliente, y si escribiera "pausa", tomaría el mismo bloqueo global utilizado por la función compartida, y no lo abandonaría hasta que escribí "jugar" en el cliente. Haciendo esto, puede obtener una parada bastante ajustada ... dependiendo de la aplicación.

Espero que ayude ... Tiny snippet a continuación. Mi aplicación era para una plataforma de prueba, así que lo que hice fue agregar el puntero de función al constructor de la clase base, y usar esto en lugar de time.sleep() .. dándome una suave capacidad de búsqueda de errores. Lo que puede hacer es pasar esto a cada hilo y agregar llamadas a la función de pausa al principio y al final de sus funciones, y le permitiría romper, etc. Quité algunos de los comandos pero puede ver que esto puede ser hecho tan extenso como lo necesite.

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

No entiendo completamente qué estaba haciendo el primer respondedor con este cliente/servidor UDP. PyDev no funciona porque obtiene estos errores extraños con algún archivo XML con el que el depurador intenta escribir con información de estado. Tal vez tiene varios subprocesos intentando escribir en el archivo al mismo tiempo cuando se ejecuta un programa multiproceso, y no está configurado para manejar eso. – MMM

+0

lo siento, nunca usé pyDev – pyInTheSky

Cuestiones relacionadas