2011-01-17 14 views
20

मुझे multiprocessing.Process() द्वारा उत्पन्न एक बाल प्रक्रिया को डीबग करने की आवश्यकता है। pdb डीगगर को पहले से चलने वाली प्रक्रियाओं से निपटने में असमर्थ और असमर्थ होने से अनजान प्रतीत होता है।पाइथन उपप्रोकस में डीबगर कैसे संलग्न करें?

क्या कोई स्मार्ट पाइथन डीबगर्स हैं जो एक उपप्रजाति से जुड़ा जा सकता है?

उत्तर

9

Winpdb एक स्मार्ट पायथन डीबगर की परिभाषा काफी अधिक है। यह स्पष्ट रूप से going down a fork का समर्थन करता है, यह सुनिश्चित नहीं है कि यह multiprocessing.Process() के साथ अच्छी तरह से काम करता है लेकिन यह एक कोशिश के लायक है।

आपके उपयोग के मामले की सहायता के लिए उम्मीदवारों की एक सूची के लिए, विकी में Python Debuggers की सूची देखें।

+1

बढ़िया! Winpdb multiprocessing.Process() – grep

+0

के साथ अच्छी तरह से काम करता है यह ध्यान दिया जाना चाहिए कि Winpdb बहु-मंच, नि: शुल्क और नि: शुल्क सॉफ्टवेयर है। – OliverUv

+0

मैं Winpdb के साथ पढ़ने और खेलने के 20 मिनट के भीतर नहीं, एक आयात के माध्यम से एक मौजूदा स्क्रिप्ट में एक इंटरैक्टिव डीबगिंग सत्र लॉन्च करने का एक तरीका ढूंढ सकता हूं, एक ला 'आयात पीडीबी; pdb.set_trace() '। हालांकि, फोर्कड पीडीबी उत्तर यहां एक आकर्षण की तरह काम करता था! – Pat

-1

यदि आप एक समर्थित प्लेटफॉर्म पर हैं, तो DTrace आज़माएं। अधिकांश बीएसडी/सोलारिस/ओएस एक्स परिवार डीटीआरएस का समर्थन करते हैं।

Here is an intro by the author। आप किसी भी चीज़ के बारे में डीबग करने के लिए Dtrace का उपयोग कर सकते हैं।

Here is a SO post डीटीआरएस सीखने पर।

35

मैं इस समस्या के लिए समाधान के लिए एक सरल के लिए खोज कर रहे हैं और इस के साथ आया था:

import sys 
import pdb 

class ForkedPdb(pdb.Pdb): 
    """A Pdb subclass that may be used 
    from a forked multiprocessing child 

    """ 
    def interaction(self, *args, **kwargs): 
     _stdin = sys.stdin 
     try: 
      sys.stdin = open('/dev/stdin') 
      pdb.Pdb.interaction(self, *args, **kwargs) 
     finally: 
      sys.stdin = _stdin 

यह उसी तरह का प्रयोग करें आप क्लासिक PDB उपयोग कर सकते हैं:

ForkedPdb().set_trace() 
+4

यह बहुत ही बढ़िया है और मेरे लिए चाल है –

+0

धन्यवाद, यह मेरे लिए भी काम करता है। – xamox

+0

अच्छी चाल। जब मैं कार्यक्रम शुरू करता हूं और '/ dev/stdin' खोलने के बजाय फोर्क प्रक्रिया में इसका उपयोग करता हूं तो मैं sys.stdin को संग्रहीत करने का सुझाव दूंगा। मुझे कारण पता नहीं है लेकिन रीडलाइन ठीक काम करता है। मैं इस पर थोड़ा सा शोध करूंगा। – memeplex

2

यह Romuald के उत्तर का एक विस्तार है जो मूल फ़ाइल stdin को अपने फ़ाइल वर्णनकर्ता का उपयोग कर बहाल करता है। यह डीबगर के अंदर काम कर रहे रीडलाइन रखता है। इसके अलावा, कीबोर्ड इंटरप्ट का पीडीबी विशेष प्रबंधन अक्षम है, ताकि यह मल्टीप्रोसेसिंग सिगिंट हैंडलर में हस्तक्षेप न करे।

class ForkablePdb(pdb.Pdb): 

    _original_stdin_fd = sys.stdin.fileno() 
    _original_stdin = None 

    def __init__(self): 
     pdb.Pdb.__init__(self, nosigint=True) 

    def _cmdloop(self): 
     current_stdin = sys.stdin 
     try: 
      if not self._original_stdin: 
       self._original_stdin = os.fdopen(self._original_stdin_fd) 
      sys.stdin = self._original_stdin 
      self.cmdloop() 
     finally: 
      sys.stdin = current_stdin 
संबंधित मुद्दे

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