2010-08-05 34 views
8

Tôi đang cố gắng để gỡ lỗi Python bằng cách sử dụng WinPDB và tôi có nhiều chủ đề bằng cách sử dụng threading.Thread. Tôi không bao giờ có thể kiểm soát các chủ đề riêng lẻ. Nếu tôi phá vỡ thực thi, toàn bộ tập lệnh sẽ bị hỏng. Nếu tôi bước qua mã nguồn của một chủ đề, tất cả những người khác tiếp tục được xen kẽ và tiếp tục một số thực thi của họ. Điều này đúng với Synchronicity bật hoặc tắt. Không phải là có một cách để bước qua một chủ đề riêng lẻ trong khi giữ những người khác tại một điểm ngắt?Làm cách nào để thực hiện từng bước một cách độc lập? (WinPDB)

WinPDB có phải là công cụ sai để sử dụng cho việc này không? Tôi chỉ không biết phải sử dụng cái gì. Eclipse PyDev hầu như không hoạt động chút nào vì bản thân trình gỡ rối dường như gặp lỗi khi bắt đầu nhiều luồng.

Công cụ thực sự mạnh mẽ gỡ lỗi chương trình Python đa luồng là gì?

Cảm ơn bạn.

+0

pdb không hỗ trợ gỡ lỗi chương trình đa luồng. Điều này sẽ làm việc với PyDev mặc dù. Bạn đang có vấn đề gì vậy? –

Trả lời

1

Tôi gặp vấn đề tương tự, đó không phải là câu trả lời lý tưởng nhất, nhưng tôi sẽ mô tả nó cho bạn và có thể bạn có thể làm việc đó.

Tôi ít nhiều đã viết một trình gỡ lỗi nhỏ. Udp Client/Server và một chức năng mà không làm gì ngoài lấy một khóa toàn cầu, ngủ .1 giây, và sau đó phát hành nó. Hàm này đã được chuyển cho mỗi luồng. Sau đó tôi đặt một cuộc gọi đến chức năng này giữa các khu vực quan trọng mà tôi muốn gỡ lỗi. Sau khi bắt đầu chương trình, máy chủ udp sẽ lắng nghe máy khách và nếu tôi gõ "tạm dừng", nó sẽ lấy cùng một khóa toàn cục được sử dụng bởi hàm chia sẻ, và không cho nó lên cho đến khi tôi gõ "play" trong máy khách. Vì vậy, làm điều này, bạn có thể nhận được một điểm dừng khá chặt chẽ ... tùy thuộc vào ứng dụng.

Hy vọng nó sẽ giúp ... Đoạn mã nhỏ bên dưới. Ứng dụng của tôi là cho một nền tảng thử nghiệm vì vậy những gì tôi đã làm là thêm con trỏ hàm vào hàm tạo lớp cơ sở, và sử dụng nó thay vì time.sleep() .. cho tôi khả năng gỡ lỗi nhẹ. Những gì bạn có thể làm là truyền điều này cho mỗi luồng và thêm các cuộc gọi vào chức năng tạm dừng ở đầu và cuối các chức năng của bạn, và nó sẽ cho phép bạn ngắt, v.v. Tôi đã xóa một số lệnh nhưng bạn có thể thấy rằng điều này có thể được làm rộng khi bạn cần.

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

Tôi không hoàn toàn hiểu những gì người trả lời đầu tiên đã làm với máy khách/máy chủ UDP này. PyDev không hoạt động vì nó nhận được các lỗi lạ này với một số tệp XML mà trình gỡ lỗi cố gắng ghi vào với thông tin trạng thái. Có lẽ nó có nhiều chủ đề cố gắng ghi vào tập tin cùng một lúc khi chạy một chương trình đa luồng, và không được thiết lập để xử lý điều đó. – MMM

+0

xin lỗi, không bao giờ sử dụng pyDev – pyInTheSky

Các vấn đề liên quan