2010-03-02 14 views
5

द्वारा मुद्रित जानकारी की मात्रा सीमित करना पर्ल कोड (कमांड लाइन डीबबगर, perl -d) में डिबगिंग के साथ मेरे पालतू शिखर में से एक यह तथ्य है कि गलती से प्रिंटिंग (x कमांड के माध्यम से) एक विशाल डेटास्ट्रक्चर की सामग्री को फ्रीज करने की गारंटी है अपने टर्मिनल को साढ़े सालों तक रखें जबकि 100 पृष्ठों के डेटा प्रिंट किए जाएंगे। खासकर अगर यह धीमी नेटवर्क पर होता है।पर्ल डीबगर

इस प्रकार, मैं x प्रिंटों की मात्रा को सीमित करने में सक्षम होना चाहता हूं।

मुझे दो दृष्टिकोण दिखाई देते हैं - अगर कोई जानता है कि मैं कैसे करना चाहता हूं तो मैं कोशिश करने के इच्छुक हूं।

  1. डीबगर प्रिंट में किसी भी कमांड डेटा की मात्रा सीमित करें।

  2. बेहतर अभी तक, कस्टम पर्ल विधि के साथ निर्मित x कमांड को प्रतिस्थापित करें (जो डेटा संरचना के "आकार" की गणना करेगा और पुष्टि के बिना इसकी सामग्री मुद्रित करने से इंकार कर देगा)।

मैं विशेष रूप से पूछ रहा हूँ "कैसे कस्टम कोड के साथ x को बदलने के लिए" - एक अच्छा पर्याप्त निर्माण पर्ल विधि कुछ बहुत ज्यादा प्रयास हालांकि बिना मैं अपने दम पर कर की संभावना कर सकते हैं कि "डेटा संरचना बहुत बड़ा है" मुझे काफी हद तक निराशाजनक प्रयास होने से "परिपूर्ण" को रोकने में पर्याप्त नुकसान दिखाई देता है। बिल्ली, केवल डेटा :: डूपर-> डंप करना और स्ट्रिंग की लंबाई लेना चाल हो सकता है :)

कृपया ध्यान दें कि मैं पूरी तरह से अच्छी तरह से जानता हूं कि डेटास्ट्रक्चर की परतों की पुन: जांच करके समस्या को मैन्युअल रूप से कैसे टालना है (उदाहरण के लिए रेफरी प्रिंट करें, चाबियाँ/सरणी तत्वों की गिनती मुद्रित करें, आदि ...) ... पूरा बिंदु यह है कि मैं सोचने के बिना x $huge_pile_of_data लिखने से बचने में सक्षम होना चाहता हूं - या एक बग पॉपुलटिंग पर ठोकर खाने से भारी ढेर एक स्केलर क्या होना चाहिए में डेटा।

+0

मैं अक्सर सरल अपने प्रश्न में वर्णित दृष्टिकोण का उपयोग, कोड करने के लिए मैं कर रहा हूँ डिबगिंग इस सबरूटीन जोड़ने: 'उप xx {उपयोग डाटा :: डम्पर; प्रिंट डूपर (@_)} '। फिर मैं 'x $ foo' की बजाय डीबगर के भीतर 'xx $ foo' का उपयोग करता हूं। जैसा कि आप कहते हैं, एक व्यक्ति प्रिंटिंग से पहले लंबाई की जांच करके 'xx()' अधिक पूर्ण-सेवा कर सकता है। – FMc

+0

@ एफएम - लेकिन यह मानता है कि आपके पास $ foo जानने का दूरदर्शिता बड़ा है। मेरी पूरी समस्या यह दुर्घटना से कर रही है। – DVK

+0

जो मैं सुझाव दे रहा हूं उसे यह आवश्यक नहीं है कि आप '$ foo' के बारे में कुछ भी मान लें। इसके बजाय, इसे आदत में बदलाव की आवश्यकता है: 'x'' के बजाय हर समय 'xx' का उपयोग करें - मुख्य रूप से क्योंकि 'डेटा :: डम्पर' का आउटपुट' x' के आउटपुट से बेहतर है, बल्कि यह भी कि आपके अपने डंपिंग सबराउटिन हाथ से समस्या के अनुसार व्यवहार को अनुकूलित करना आसान बनाता है। बिल्कुल एक विचार, ज़ाहिर है। – FMc

उत्तर

8

| डीबगर पाइप में कमांड आपके पेजर, उदा।

 DB<1> |x %huge_datastructure
11

x कमांड प्रदर्शित करने के लिए अधिकतम गहराई के लिए वैकल्पिक तर्क लेता है। यह एन पृष्ठों पर डेटा की मात्रा सीमित करने के समान नहीं है, लेकिन अधिभार को रोकने के लिए यह निश्चित रूप से उपयोगी है।

DB<1> %h = (a => { b => { c => 1 } }) 

    DB<2> x %h 
0 'a' 
1 HASH(0x1d5ff44) 
    'b' => HASH(0x1d61424) 
     'c' => 1 

    DB<3> x 2 %h 
0 'a' 
1 HASH(0x1d5ff44) 
    'b' => HASH(0x1d61424) 

आप o आदेश, उदा के माध्यम से मुद्रित करने के लिए डिफ़ॉल्ट गहराई निर्दिष्ट कर सकते हैं

DB<1>o dumpDepth=1 

अपने .perldb फाइल करने के लिए कि जोड़ें सभी डिबगर सत्र में इसे लागू करने के लिए।

अन्यथा, यह x आदेश की तरह का आह्वान DB::dumpit() जो सिर्फ dumpval.pl (या, और अधिक विशेष, main::dumpValue() उप में परिभाषित करता है) के लिए एक आवरण है लग रहा है। जब आप फिट देखते हैं तो आप उस स्क्रिप्ट को संशोधित/प्रतिस्थापित कर सकते हैं। मुझे यकीन नहीं है कि आप इसे कैसे इंटरैक्टिव बना देंगे।

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