2010-08-05 2 views
8

Я пытаюсь отлаживать Python с помощью WinPDB, и у меня есть несколько потоков, используя threading.Thread. Кажется, я никогда не могу контролировать потоки индивидуально. Если я нарушаю исполнение, весь скрипт прерывается. Если я пройду через исходный код одного потока, все остальные будут чередоваться и продолжить выполнение. Это верно при включении или выключении Synchronicity. Разве нет возможности индивидуально переходить через поток, сохраняя остальных в точке останова?Как пройти через потоки Python независимо? (WinPDB)

Возможно, WinPDB не тот инструмент? Я просто не знаю, что использовать. Eclipse PyDev практически не работает, потому что сам отладчик, похоже, получает ошибки при запуске нескольких потоков.

Что такое инструмент, который на самом деле будет безопасно отладить многопоточную программу Python?

спасибо.

+0

PDB не поддерживает отладку многопоточных программ. Это должно работать с PyDev. Какую проблему вы испытываете? –

ответ

1

У меня была аналогичная проблема, это не самый идеальный ответ, но я опишу его для вас, и, возможно, вы сможете отработать.

Я более или менее написал мини-отладчик. Udp Client/Server и функция, которая ничего не делала, кроме как захватить глобальную блокировку, спать .1 секунд, а затем отпустить ее. Эта функция передавалась каждому потоку. Затем я вызывал эту функцию между критическими областями, которые я хотел отлаживать. После запуска программы udp-сервер будет прослушивать клиент, и если бы я набрал «паузу», он бы захватил тот же глобальный блокировщик, который использовался совместно используемой функцией, и не отдавал его до тех пор, пока я не набрал «play» в клиенте. Таким образом, вы можете получить довольно жесткую остановку ... в зависимости от приложения.

Надеюсь, это поможет ... Крошечный сниппет ниже. Мое приложение предназначалось для тестовой платформы, поэтому я добавил добавление указателя на конструктор базового класса и использовал его вместо time.sleep(), что дало мне легкую отладку. Что вы можете сделать, это передать это каждому потоку и добавить вызовы функции паузы в начале и конце ваших функций, и это позволит вам сломать и т. Д. Я удалил некоторые из команд, но вы можете видеть, что это может быть сделанный настолько обширным, насколько вам это нужно.

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

Я не совсем понимаю, что первый ответчик делал с этим UDP-клиентом/сервером. PyDev не работает, потому что он получает эти странные ошибки с некоторым XML-файлом, который отладчик пытается записать с информацией о состоянии. Возможно, он имеет несколько потоков, пытающихся записать в файл одновременно при запуске многопоточной программы и не настроен для этого. – MMM

+0

извините, никогда не использовал pyDev – pyInTheSky

 Смежные вопросы

  • Нет связанных вопросов^_^