2009-10-16 10 views
5

मैं पर्ल डीबगर में मनमाने ढंग से अपना निष्पादन बिंदु निर्धारित करने के लिए (उचित रूप से) सक्षम होना चाहता हूं। उदाहरण के लिए, यदि किसी चर के एक से पहले और एक चर सेट करने से पहले तुरंत आगे बढ़ना।मैं पर्ल डीबगर में निर्देश बिंदु कैसे ले जाऊं?

perldebug (और perldebguts और perl debugger पीओडी) पृष्ठ के आसपास rummaging सुझाव देता है कि इस तरह की कार्यक्षमता या तो समर्थित नहीं है या दस्तावेज नहीं है।

+3

मैं कल्पना करने की कोशिश कर रहा हूं कि आप क्या करना चाहते हैं, लेकिन नहीं कर सकते। मैं इसके बजाय अनुमान लगाऊंगा। बी :: यूटिल या बी :: हुक :: ओपी :: चेक सहायक हो सकता है; ऑप्ट्री संपादित करें और अगले ऑप को उस पर सेट करें जिसे आप निष्पादित करना चाहते हैं; या निष्पादित होने पर एक सेशन और रन कोड को हुक करें। एक कस्टम रनलोप भी सहायक हो सकता है। लेकिन मूल रूप से, आप यहां पर हैं; समय यात्रा perl5db की एक विशेषता नहीं है। – jrockway

+0

समय यात्रा नहीं है। मैं मनमाने ढंग से निष्पादन समय के बिंदु को किसी दिए गए स्थान पर सेट करना चाहता हूं, * ऐसा करने की संवेदना के लिए * बिना किसी सम्मान के *। –

+0

कस्टम रनलोप तब अच्छा लगता है। आप जो करना चाहते हैं वह बहुत अजीब है, हालांकि, यह लागू नहीं किया गया है। – jrockway

उत्तर

-1

यह मौजूदा डीबगर के साथ नहीं किया जा सकता है।

+0

एक सेकंड प्रतीक्षा करें, अब तक हर उत्तर "नहीं" है और मुझे वोट दिया गया है? वास्तव में? – nick

+1

आपका उत्तर "नहीं" था। आपके उत्तर ने केवल हमें बताया कि यह क्या है कि आप विश्वास नहीं करते हैं। यह बहुत आत्मविश्वास नहीं लगता है। तो आप वास्तव में जवाब नहीं जानते हैं, और आपके पास सुझाव देने का कोई विकल्प नहीं है। आपका उत्तर उपयोगी नहीं था, और इसलिए नकारात्मक वोट के योग्य था। (मैंने सोचा था कि -1 पर्याप्त था, इसलिए मैंने इसे स्वयं वोट नहीं दिया।) इसके अलावा, अन्य उत्तरों "नहीं" थे। यह एक हां/नहीं सवाल था। यह एक "कैसे" सवाल था। यदि आप नहीं जानते कि कैसे, और आप नहीं जानते कि यह असंभव है, तो आपका जवाब वास्तव में क्या योगदान देगा? –

0

ब्रेकपॉइंट केवल एक कथन की पहली पंक्ति पर सेट किया जा सकता है।

+0

मैं ब्रेकपॉइंट सेट नहीं कर रहा हूं। मैं अपने निष्पादन बिंदु को स्थानांतरित करना चाहता हूं - पर्ल वीएम के निर्देश सूचक। –

+2

पॉल क्या मांग रहा है वह ब्रेकपॉइंट्स नहीं करता है। हालांकि कार्यक्रम रोका गया है, पॉल एक विशिष्ट रेखा पर इंगित करना चाहता है और कहता है, "अभी यहां दौड़ना शुरू करें, पहले और कुछ भी न चलाएं।" ब्रेकपॉइंट आपको कोड को छोड़ने या कोड को फिर से चलाने की अनुमति नहीं देता है जिसे आपने अभी पारित किया है। आईपी ​​चलाना –

+1

रॉब यह सही है। –

1

एक बोझिल कामकाज आपके कोड में लेबल और सशर्त goto बयान जोड़ने के लिए होगा। लेकिन इस सुविधा के अनुकरण के लिए आप कितनी बुरी तरह से इस पर निर्भर करते हैं, यह इसके लायक हो सकता है।

POINT1: $GOTO="";  # $GOTO is our fake variable that we only set from the debugger 
($a,$b,$c)=(1,2,3); 
POINT2: $GOTO=""; 
if ($a < $b) { 
    goto $GOTO if $GOTO; 
    if ($a > $c) { 
     goto $GOTO if $GOTO; 
     print "foo\n"; 
    } else { 
     goto $GOTO if $GOTO; 
     print "bar\n"; 
    } 
    goto $GOTO if $GOTO; 
} else { 
    goto $GOTO if $GOTO; 
    print "nothing\n"; 
    goto $GOTO if $GOTO; 
} 

नमूना डिबगिंग सत्र:

$ perl -d debuggoto.pl 

Loading DB routines from perl5db.pl version 1.28 
Editor support available. 

Enter h or `h h' for help, or `man perldebug' for more help. 

main::(debuggoto.pl:1): POINT1: $GOTO="";  # $GOTO is our fake variable that we only set from the debugger 
    DB<1> n 
main::(debuggoto.pl:2): ($a,$b,$c)=(1,2,3); 
    DB<1> 
main::(debuggoto.pl:3): POINT2: $GOTO=""; 
    DB<1> 
main::(debuggoto.pl:4): if ($a < $b) { 
    DB<1> 
main::(debuggoto.pl:5): goto $GOTO if $GOTO; 
    DB<1> 
main::(debuggoto.pl:6): if ($a > $c) { 
    DB<1> 
main::(debuggoto.pl:10):    goto $GOTO if $GOTO; 
    DB<1> 
main::(debuggoto.pl:11):    print "bar\n"; 
    DB<1> 
bar 
main::(debuggoto.pl:13):   goto $GOTO if $GOTO; 
    DB<1> $GOTO="POINT2" 

    DB<2> n 
main::(debuggoto.pl:3): POINT2: $GOTO=""; 
    DB<2> $c=0 

    DB<3> n 
main::(debuggoto.pl:4): if ($a < $b) { 
    DB<3> 
main::(debuggoto.pl:5): goto $GOTO if $GOTO; 
    DB<3> 
main::(debuggoto.pl:6): if ($a > $c) { 
    DB<3> 
main::(debuggoto.pl:7):  goto $GOTO if $GOTO; 
    DB<3> 
main::(debuggoto.pl:8):  print "foo\n"; 
    DB<3> 
foo 
main::(debuggoto.pl:13):   goto $GOTO if $GOTO; 
    DB<3> 
Debugged program terminated. Use q to quit or R to restart, 
    use o inhibit_exit to avoid stopping after program termination, 
    h q, h R or h o to get additional info. 
    DB<3> 
Use `q' to quit or `R' to restart. `h q' for details. 
    DB<3> 

मुझे आश्चर्य है कि अगर यह एक डिबगर इस विचार का उपयोग करता है के निर्माण के लिए संभव हो जाएगा।

+1

हुन। मैं उस स्तर पर स्रोत के साथ मैन्युअल रूप से * मक नहीं करना चाहता, लेकिन एक स्वचालित स्रोत को संशोधित करना और डीबगर चलाने के लिए ... अब एक विचार है। –

1

मुझे अभी भी यह सुनिश्चित नहीं है कि यह वास्तव में क्या हासिल करेगा, लेकिन मैं एक कस्टम रनलोप शर्त लगाता हूं जो आपको तब तक परवाह नहीं करता जब तक कि आप फिर से देखभाल शुरू नहीं करते हैं, आपकी समस्या का समाधान हो सकता है।

कार्गो-पंथ के लिए एक अच्छा रनलोप Runops::Switch है। स्विच कथन को हटाएं और एक ऐसा फ़ंक्शन लिखें जो ओप को छोड़ देता है जब तक कि आप उस भाग पर न हों; तो वास्तव में उस op को चलाने के लिए सामान्य रनलोप में कॉल करें।

प्रासंगिक कोड: http://cpansearch.perl.org/src/RGARCIA/Runops-Switch-0.04/Switch.xs

यह सब handwaving, मैं कभी एक runloop से पहले लिखा है है। एक और पोस्ट में गोटो विचार भी अच्छा है, लेकिन इसमें कम कोड लिखना शामिल है।

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