2010-08-05 13 views
8

मैं WinPDB का उपयोग करके पाइथन को डीबग करने का प्रयास कर रहा हूं और मेरे पास थ्रेडिंग का उपयोग करके एकाधिक थ्रेड हैं। थ्रेड। मैं धागे को अलग-अलग नियंत्रित नहीं कर सकता। अगर मैं निष्पादन तोड़ता हूं, तो पूरी लिपि टूट जाती है। यदि मैं एक थ्रेड के स्रोत कोड से आगे बढ़ता हूं, तो बाकी सभी को अंतःस्थापित किया जाता है और उनके कुछ निष्पादन जारी रहता है। Synchronicity चालू या बंद के साथ यह सच है। दूसरों को ब्रेकपॉइंट पर रखते हुए अलग-अलग धागे से कदम उठाने का कोई तरीका नहीं है?पाइथन धागे से स्वतंत्र रूप से कैसे कदम उठाएं? (WinPDB)

क्या WinPDB इस के लिए उपयोग करने के लिए गलत उपकरण है? मुझे नहीं पता कि क्या उपयोग करना है। ग्रहण PyDev मुश्किल से काम करता है क्योंकि कई धागे शुरू करते समय डीबगर खुद को दौड़ त्रुटियों को प्राप्त करता है।

एक उपकरण क्या है जो वास्तव में मजबूत होगा एक बहु थ्रेडेड पायथन प्रोग्राम डीबग करें?

धन्यवाद।

+0

pdb बहु कार्यक्रमों डिबगिंग समर्थन नहीं करता। हालांकि यह PyDev के साथ काम करना चाहिए। आप कौन सी समस्या का सामना कर रहे हैं? –

उत्तर

1

मुझे एक समान समस्या थी, यह सबसे आदर्श उत्तर नहीं है, लेकिन मैं इसका आपके लिए वर्णन करूंगा और शायद आप इसका काम कर सकते हैं।

मैंने मिनी डिबगर को कम से कम लिखा था। Udp क्लाइंट/सर्वर और एक ऐसा फ़ंक्शन जिसने कुछ भी नहीं किया लेकिन वैश्विक लॉक पकड़ लिया, 1 सेकंड सो, और फिर इसे छोड़ दें। यह कार्य प्रत्येक धागे को पारित कर दिया गया। इसके बाद मैंने महत्वपूर्ण कार्यों के बीच इस समारोह में एक कॉल किया जिसे मैं डीबग करना चाहता था। प्रोग्राम शुरू करने के बाद, udp सर्वर क्लाइंट के लिए सुनेगा, और यदि मैंने "रोकें" टाइप किया है, तो यह साझा फ़ंक्शन द्वारा उपयोग किए जाने वाले एक ही वैश्विक लॉक को पकड़ लेगा, और जब तक मैंने क्लाइंट में "प्ले" टाइप नहीं किया तब तक इसे तब तक न दें। तो ऐसा करने से, आप आवेदन के आधार पर काफी तंग स्टॉप प्राप्त कर सकते हैं।

उम्मीद है कि यह मदद करता है ... नीचे छोटे स्निपेट। मेरा आवेदन एक टेस्ट प्लेटफ़ॉर्म के लिए था, इसलिए मैंने जो किया वह बेस क्लास कन्स्ट्रक्टर को फ़ंक्शन पॉइंटर जोड़ता था, और 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

मैं पूरी तरह समझ नहीं पा रहा हूं कि पहला उत्तरदाता इस यूडीपी क्लाइंट/सर्वर के साथ क्या कर रहा था। PyDev काम नहीं करता है क्योंकि यह कुछ अजीब त्रुटियों को कुछ XML फ़ाइल के साथ प्राप्त करता है जो डीबगर राज्य की जानकारी के साथ लिखने की कोशिश करता है। हो सकता है कि इसमें एकाधिक थ्रेड एक ही समय में फ़ाइल को लिखने की कोशिश कर रहे हों, जब एक बहुप्रचारित प्रोग्राम चलाते हैं, और इसे संभालने के लिए सेट नहीं किया गया है। – MMM

+0

क्षमा करें, कभी भी pyDev का उपयोग नहीं किया – pyInTheSky

संबंधित मुद्दे