2010-11-18 10 views
8

मैं पर्ल स्क्रिप्ट्स (लिनक्स पर) डिबगिंग के लिए इमेक्स में perldb का उपयोग करता हूं। महान काम करता है, जब तक कि मैं एक स्क्रिप्ट को डिबग नहीं कर रहा हूं।पर्ल स्क्रिप्ट्स को डीबग करने के लिए कैसे करें कि कांटा

######### Forked, but do not know how to create a new TTY. ######### 
    Since two debuggers fight for the same TTY, input is severely entangled. 

    I know how to switch the output to a different window in xterms 
    and OS/2 consoles only. For a manual switch, put the name of the created TTY 
    in $DB::fork_TTY, or define a function DB::get_fork_TTY() returning this. 

    On UNIX-like systems one can get the name of a TTY for the given window 
    by typing tty, and disconnect the shell from TTY by sleep 1000000. 

मैं वास्तव में, जबकि दे और दूसरी, (या तो माता-पिता या बच्चे) एक प्रक्रिया चुनें और उस प्रक्रिया डिबगिंग जारी रखने के लिए सक्षम होने के लिए करना चाहते हैं: मेरी स्क्रिप्ट एक "कांटा" निष्पादित करता है, तो मैं इस मिल unimpeded जारी रखें। एक विस्तृत लक्ष्य दोनों प्रक्रियाओं को डीबग करने के लिए अनजाने में एक तरीका होगा, शायद नियंत्रण और कोड विंडो के लिए emacs में अतिरिक्त फ्रेम खोलना। लेकिन उनमें से एक को डिबगिंग जारी रखने में सक्षम होने से बड़ी जीत होगी।

क्या यह perldb में ऐसा करने का कोई तरीका है? मैंने इस संदेश में सुझाव का पालन करने की कोशिश की, लेकिन इसके साथ कहीं भी नहीं मिला।

या मुझे कुछ अन्य पर्ल डीबगिंग टूल की आवश्यकता है? यदि उत्तरार्द्ध, जो पर्ल डीबगर बहु-प्रक्रिया डीबगिंग के लिए सबसे अच्छा समर्थन प्रदान करता है?

उत्तर

3

चूंकि यह संभव है कि एक xterm या इसी तरह के नीचे चल रहे हैं, तो आपको पर्ल डीबगर के "xterm" के बजाय संकीर्ण दृश्य से काटा जा सकता है।

यह विशेष रूप से स्ट्रिंग "xterm" की तलाश में है। यह TERM पर्यावरण चर में xterm देखना चाहता है। gnome-terminal नहीं। xterm-256color नहीं। बस xterm। साथ

रन:

TERM=xterm perl -d ... 

यकीन है कि यह चित्र मिले। मैंने केवल यह पाया कि पर्ल डीबगर पर दस मिनट के ग्रुपिंग के बाद बाहर एक।

यह एक्सटेरम खिड़कियों के टन को बहुत खुश करने के लिए बहुत खुश लगता है और जब तक यह निकलता है, तो उन्हें साफ करने में बहुत अच्छा प्रतीत नहीं होता है।

1

इस स्थिति में, लॉग फ़ाइलों को स्थापित करना (प्रत्येक पंक्ति में प्रक्रिया के पीआईडी ​​के साथ) अच्छी तरह से जाने का तरीका हो सकता है। हालांकि डीबगर के रूप में सुविधाजनक नहीं है, यह संभवतः यह समझने का एक आसान तरीका होगा कि आपके कोड के साथ क्या चल रहा है।

+0

यदि आप इस मार्ग पर जा रहे हैं, तो 'डेवेल :: ट्रेस :: फोर्क' देखें। – mob

5

यदि आपके पास कंसोल और जीयूआई डेस्कटॉप तक पहुंच है, तो एक एक्सटरएम विंडो में डीबगर चलाएं। पर्ल डीबगर xterms के साथ निर्बाध रूप से काम करता है, क्योंकि चेतावनी संदेश का संकेत मिलता है। चूंकि नई प्रक्रियाएं बनाई जाती हैं, डीबगर नई xterm विंडो खुलता है, और आप किसी भी क्रम में किसी भी प्रक्रिया में निष्पादन के माध्यम से कदम उठा सकते हैं।

किसी भी मामले में, inhibit_exit ध्वज साफ़ करने से बहु-प्रक्रिया कार्यक्रमों को डिबग करने के लिए भी उपयोगी है। रन

o inhibit_exit=0 

डीबगर प्रॉम्प्ट से चलाएं। इस तरह, जब आप पर्ल चलाने वाली एक नई प्रक्रिया को जन्म देते हैं, और बच्चे की प्रक्रिया के अंदर किसी भी बिंदु को तोड़ने का कोई कारण नहीं है, तो बच्चे की प्रक्रिया Debugged program terminated. Use q to quit or R to restart ... संदेश के साथ डीबगर को बाधित नहीं करेगी।

3

एक xterm विंडो में डिबगर चल रहा है शायद इस समस्या का आसान समाधान है, लेकिन this article एक वैकल्पिक दृष्टिकोण का वर्णन करता है: एक गैर-दस्तावेजी चर $DB::fork_TTY जो काँटेदार प्रक्रियाओं के लिए एक विशेष TTY निर्दिष्ट कर सकते हैं।

बेशक, आप शायद अपने कोड में इस तरह के तर्क को हार्ड-कोड नहीं करना चाहते हैं, इसलिए आप एक डीबगर मॉड्यूल बना सकते हैं जिसका उपयोग आप केवल जब आप अपने perl कमांड में -एम ध्वज के माध्यम से करते हैं।

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