2009-04-07 12 views
8

जो मैं कह सकता हूं, पीडीबी पहचान नहीं करता है जब स्रोत कोड "रन" के बीच बदल गया है। यही है, अगर मैं डिबगिंग कर रहा हूं, तो एक बग नोटिस करें, उस बग को ठीक करें, और प्रोग्राम को पीडीबी में पुन: चालू करें (यानी पीडीबी से बाहर निकलने के बिना), पीडीबी कोड को फिर से संकलित नहीं करेगा। मैं अभी भी कोड के पुराने संस्करण को डिबग कर दूंगा, भले ही पीडीबी नए स्रोत कोड को सूचीबद्ध करे।पीडीबी कैसे पहचानें कि स्रोतों के बीच स्रोत बदल गया है?

तो, pdb स्रोत परिवर्तन के रूप में संकलित कोड को अद्यतन नहीं करता है? यदि नहीं, तो ऐसा करने का कोई तरीका है? मैं अपने ब्रेकपॉइंट्स और ऐसे रखने के लिए एक पीडीबी सत्र में रहना चाहता हूं।

Fwiw, gdb जब कार्यक्रम यह केवल उस कार्यक्रम का एक पुनः आरंभ करने पर हालांकि, इसे नीचे परिवर्तन डिबगिंग है देखेंगे। यह वह व्यवहार है जिसे मैं पीडीबी में दोहराने की कोशिश कर रहा हूं।

उत्तर

2

आप से क्या मतलब है "pdb में कार्यक्रम को फिर से चलाएं?" यदि आपने मॉड्यूल आयात किया है, तो पायथन इसे तब तक नहीं पढ़ेगा जब तक आप स्पष्ट रूप से ऐसा करने के लिए नहीं कहें, यानी reload(module) के साथ। हालांकि, reload बुलेटप्रूफ से बहुत दूर है (अन्य रणनीति के लिए xreload देखें)।

वहाँ अजगर कोड reloading में नुकसान के बहुत सारे हैं। अपनी समस्या को और अधिक मजबूत ढंग से हल करने के लिए, आप एक कक्षा के साथ पीडीबी लपेट सकते हैं जो डिस्क पर फ़ाइल में आपकी ब्रेकपॉइंट जानकारी रिकॉर्ड करता है, उदाहरण के लिए, और उन्हें कमांड पर वापस चलाता है।

(क्षमा करें, यह जवाब के पहले संस्करण की अनदेखी, यह जल्दी है और मैं ध्यान से पर्याप्त अपने प्रश्न पढ़ा नहीं था।)

+0

मैं "फिर से दौड़ना" से क्या मतलब धारणात्मक, है, क्या मैं से एक अजगर कार्यक्रम का पुनर्प्रसारण मतलब कमांड लाइन। पीडीबी स्पष्ट रूप से मेरे कार्यक्रम से बाहर निकलने की धारणा को समझता है, इसलिए मैं सोच रहा हूं, जब यह मेरे कार्यक्रम को दूसरी बार चलाता है, अगर मैं इसे आवश्यकतानुसार स्रोत को पुन: संकलित करने के लिए प्राप्त कर सकता हूं। – user88028

+0

आप इसे फिर से चलाने से पहले पीडीबी के अंदर से 'पुनः लोड' का उपयोग करने का प्रयास कर सकते हैं, लेकिन फिर से, आपके प्रोग्राम की संरचना के आधार पर, यह विश्वसनीय नहीं हो सकता है। (एफडब्ल्यूआईडब्लू, मैं इसे एक भाषा के रूप में पाइथन की सबसे बड़ी विफलता मानता हूं। स्मॉलटाक और लिस्प जैसे वातावरण से आ रहा है, यह बस निराशाजनक है।) –

+0

@ निकोलस रिले मैं पायथन ट्रैन डीबगर्स में एक कमांड के रूप में xreload को शामिल करना चाहता हूं (trepan3k https: //pypi.python.org/pypi/trepan3k और trepan2 https://pypi.python.org/pypi/trepan2)। ये जीपीएल 3 हैं। यह ठीक है? क्या आप लेखक हैं? – rocky

3

निम्नलिखित मिनी मॉड्यूल मदद मिल सकती है। आप अपने pdb सत्र में आयात है, तो आप उपयोग कर सकते हैं:

pdb> pdbs.r() 

किसी भी समय को छोड़कर मुख्य सभी गैर-प्रणाली मॉड्यूल के लिए मजबूर-फिर से लोड करने के लिए। कोड को छोड़ देता है कि क्योंकि यह एक ImportError फेंकता है ('फिर से init नहीं किया जा सकता आंतरिक मॉड्यूल मुख्य') अपवाद।

# pdbs.py - PDB support 

from __future__ import print_function 

def r(): 
    """Reload all non-system modules, so a pdb restart 
    will reload anything new 
    """ 
    import sys 
    # This is likely to be OS-specific 
    SYS_PREFIX = '/usr/lib' 

    for k, v in sys.modules.items(): 
     if not hasattr(v, '__file__'): 
      continue 
     if v.__file__.startswith(SYS_PREFIX): 
      continue 
     if k == '__main__': 
      continue 
     print('reloading %s [%s]' % (k, v.__file__)) 
     reload(v) 
+0

जब मैं pdb.r() चलाता हूं, मुझे मिलता है: *** विशेषताएँ त्रुटि: 'dict' ऑब्जेक्ट में कोई विशेषता नहीं है 'iteritems' – Chelmite

+0

मेरी माफ़ी - .iteritems() पायथन 3.x के साथ संगत नहीं है। मैंने कोड को संशोधित किया है ताकि इसे काम करना चाहिए। – pourhaus