2010-08-05 32 views
8

我想使用WinPDB調試Python,並且我有多個使用threading.Thread的線程。我似乎永遠不會單獨控制線程。如果我中斷執行,整個腳本就會中斷。如果我單步執行一個線程的源代碼,則其他所有其他線程繼續進行交錯並繼續其一些執行。在打開或關閉Synchronicity時,情況屬實。沒有一種方法可以單獨通過一個線程,同時讓其他人處於斷點?如何獨立完成Python線程? (WinPDB)

WinPDB是錯誤的工具嗎?我只是不知道該用什麼。 Eclipse PyDev幾乎沒有任何作用,因爲調試器本身似乎在啓動多個線程時出現競爭錯誤。

什麼是實際上的工具調試多線程Python程序?

謝謝。

+0

PDB不支持調試多線程程序。這應該與PyDev一起工作。你遇到什麼問題? – 2010-08-07 13:47:37

回答

1

我有類似的問題,這不是最理想的答案,但我會爲你描述它,也許你可以解決它。

我或多或少地寫了一個迷你調試器。 Udp客戶端/服務器和一個除了獲取全局鎖定之外什麼也不做的函數,睡眠1秒,然後釋放它。這個函數被傳遞給每個線程。然後我打電話給我想調試的關鍵區域之間的這個函數。啓動程序後,udp服務器將監聽客戶端,如果我輸入「pause」,它將獲取共享函數使用的同一個全局鎖,並且不會放棄,直到我在客戶端中鍵入「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 2010-08-12 18:21:03

+0

對不起,從未使用pyDev – pyInTheSky 2010-08-23 15:50:49