2012-01-12 8 views
32

मेरे पास एक चल रही पर्ल प्रक्रिया है जो अटक गया है, मैं यह देखने के लिए एक डीबगर के साथ अंदर पोक करना चाहता हूं कि क्या गलत है। मैं प्रक्रिया को पुनरारंभ नहीं कर सकता। क्या मैं डीबगर को चल रही प्रक्रिया में संलग्न कर सकता हूं? मुझे पता है कि मैं gdb -p कर सकता हूं, लेकिन gdb मेरी मदद नहीं करता है। मैं Enbugger की कोशिश की है, लेकिन असफल:मैं चल रहे पर्ल प्रक्रिया में डीबगर कैसे संलग्न कर सकता हूं?

$ perl -e 'while (1) {}'& 
[1] 86836 
$ gdb -p 86836 
… 
Attaching to process 86836. 
Reading symbols for shared libraries . done 
Reading symbols for shared libraries ............................. done 
Reading symbols for shared libraries + done 
0x000000010c1694c6 in Perl_pp_stub() 
(gdb) call (void*)Perl_eval_pv("require Enbugger;Enbugger->stop;",0) 
perl(86836) malloc: *** error for object 0x3: pointer being realloc'd was not allocated 
*** set a breakpoint in malloc_error_break to debug 

Program received signal SIGABRT, Aborted. 
0x00007fff8269d82a in __kill() 
The program being debugged was signaled while in a function called from GDB. 
GDB remains in the frame where the signal was received. 
To change this behavior use "set unwindonsignal on" 
Evaluation of the expression containing the function (Perl_eval_pv) will be abandoned. 
(gdb) 

Am मैं इसे गलत कर? क्या अन्य विकल्प हैं?


पीएस आपको लगता है कि आप एक डिबगर चल रहे एक अपने आप को इस प्रक्रिया से जुड़ी से फायदा हो सकता है, तो आप एक डिबगर पिछले दरवाजे SIGUSR1 से शुरू हो रहा सम्मिलित कर सकते हैं:

use Enbugger::OnError 'USR1'; 

तो फिर तुम बस kill -USR1 pid और अपने प्रक्रिया डीबगर में कूद जाएगा कर सकते हैं।

उत्तर

6

मैंने कभी भी जीडीबी का उपयोग नहीं किया है, लेकिन हो सकता है कि आप कुछ स्ट्रेस से उपयोगी हो सकें?

strace -f -s512 -p <PID> 
11

सबसे पहले, एक डिबगिंग पर्ल का इस्तेमाल करें यदि आप gdb के साथ निरीक्षण करने के लिए चाहते हैं।

कृपया "अटक" को परिभाषित करें। व्यस्त या गैर व्यस्त प्रतीक्षा (उच्च या निम्न सीपीयू), स्मृति खा रहे हैं या नहीं? 1 के साथ यह व्यस्त इंतजार कर रहा है। मैं आमतौर पर 5.15 से Perl_hfree_next_entry() में एचवी भ्रष्टाचार पर व्यस्त प्रतीक्षा (अंतहीन चक्र) प्राप्त करता हूं। गैर-व्यस्त प्रतीक्षा आमतौर पर अवरुद्ध आईओ पढ़ने पर प्रतीक्षा कर रही है।

मैं सही मिलती है:

`0x00007fba15ab35c1 in Perl_runops_debug() at dump.c:2266` 
`2266  } while ((PL_op = PL_op->op_ppaddr(aTHX)));` 

और सब कुछ, एक सरल पर्ल डीबगर के साथ तुलना में बहुत अधिक निरीक्षण कर सकते हैं। एक गैर थ्रेडेड perl के साथ आपको कम टाइप करना होगा।

`(gdb) p Perl_op_dump(PL_op)` 

और इसी तरह।

यदि आपको perl के साथ करना है: pp_stub फ़ंक्शन के अंदर Enbugger runloop दर्ज करना अच्छा नहीं है, तो आपको dump.c. में मुख्य रनलोप में होना चाहिए। दिखाए गए लाइन में ब्रेकपॉइंट सेट करें।

संदर्भ में आंतरिक भ्रष्टाचार जैसे eval ध्वनि पर "ऑब्जेक्ट 0x3 के लिए त्रुटि", तो आपको सीएक्स और स्टैक पॉइंटर्स को देखना चाहिए। शायद क्योंकि आपने इसे खराब संदर्भ में शुरू किया था।

4

http://metacpan.org/pod/App::Stacktrace "पर्ल-स्टैकट्रैक किसी दिए गए पर्ल प्रक्रिया के लिए पर्ल थ्रेड के पर्ल स्टैक निशान प्रिंट करता है। प्रत्येक पर्ल फ्रेम के लिए, पूर्ण फ़ाइल नाम और रेखा संख्या मुद्रित की जाती है। "

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