2010-03-02 13 views

उत्तर

14

कई उपयोगी, कोर हैं ई और सीपीएएन आधारित उपकरण एक स्टैक ट्रेस उत्पन्न करने के लिए (जैसे अन्य उत्तरों बताते हैं।) हालांकि, अगर आप अपना रोल करना चाहते हैं, तो caller बिल्टिन देखें। आप स्टैक को नीचे चलने के लिए इसका उपयोग कर सकते हैं और देख सकते हैं कि क्या हो रहा है।

+4

उह था, या 'डेवेल :: स्टैकट्रेस' का उपयोग करें। – jrockway

+5

यह एक अच्छा, अन्य विकल्प है। लेकिन इसके लिए एक बाहरी मॉड्यूल की आवश्यकता है, जो आकर्षक हो सकता है या नहीं। डाउनवॉटिंग के बजाय, इसे सिर्फ उत्तर के रूप में क्यों न पोस्ट करें? –

31

Carp::confess (use Carp; से) आपको त्रुटि के हिस्से के रूप में एक पूर्ण स्टैक ट्रेस देगा। यदि आपको बस कुछ विफल होने के हिस्से के रूप में इसकी आवश्यकता है, तो confess आपको वास्तव में आवश्यकता है।

टिप्पणियों के अनुसार, यहां विभिन्न Carp कार्यों का उत्पादन है:

use strict; 
use warnings; 
use Carp qw/longmess cluck confess/; 

sub foo { 
    &bar; 
} 

sub bar { 
    &baz; 
} 

sub baz { 
    shift->(); 
} 

my %tests = (
    'longmess' => sub { print longmess 'longmess' }, 
    'cluck' => sub { cluck 'using cluck' }, 
    'confess' => sub { confess 'using confess' }, 
); 

while (my ($name, $sub) = each %tests) { 
    print "$name - before eval:\n"; 
    eval { 
     foo($sub); 
    }; 
    print "$name - before if:\n"; 
    if ([email protected]) { 
     print "caught: [email protected]"; 
    } 
    print "$name - done\n\n"; 
} 

इस स्क्रिप्ट चल रहा है, आप पाते हैं:

 
longmess - before eval: 
longmess at - line 14 
     main::baz called at - line 10 
     main::bar called at - line 6 
     main::foo('CODE(0x183a4d0)') called at - line 26 
     eval {...} called at - line 25 
longmess - before if: 
longmess - done 

confess - before eval: 
confess - before if: 
caught: using confess at - line 20 
     main::__ANON__() called at - line 14 
     main::baz called at - line 10 
     main::bar called at - line 6 
     main::foo('CODE(0x183a3e0)') called at - line 26 
     eval {...} called at - line 25 
confess - done 

cluck - before eval: 
using cluck at - line 19 
     main::__ANON__() called at - line 14 
     main::baz called at - line 10 
     main::bar called at - line 6 
     main::foo('CODE(0x183a434)') called at - line 26 
     eval {...} called at - line 25 
cluck - before if: 
cluck - done 

इस स्क्रिप्ट चल रहा है लेकिन STDOUT पुनः निर्देशित (इस प्रकार दिखा क्या STDERR पर मुद्रित हो जाता है) , आपको मिलता है:

 
using cluck at - line 19 
     main::__ANON__() called at - line 14 
     main::baz called at - line 10 
     main::bar called at - line 6 
     main::foo('CODE(0x183a434)') called at - line 26 
     eval {...} called at - line 25 
+3

स्टैक ट्रेस और STDERR करने के लिए त्रुटि भेजता है कि; यदि आपको इसे कैप्चर करने की आवश्यकता है, तो सीधे अंतर्निहित कार्प :: लांगमेस() का उपयोग करें। और कार्प :: क्लक कबूल की तरह है लेकिन बाद में मर जाता है। – ysth

+2

मुझे लगता है कि पीछे की ओर है - 'क्लक' एक स्टैक ट्रेस के साथ एक चेतावनी है और 'कबूल' एक मर है। – mob

+0

गलती, हाँ, वह पिछला – ysth

31

डीबगिंग आवश्यकताओं के लिए, मुझे Carp::Always पसंद है।

perl -MCarp::Always my_script.pl 
+1

मुझे लगता है कि -एमएमआरपी = वर्बोज़ करने की आवश्यकता है – brianegge

9

caller का उपयोग करके आसान तरीका। यह कोड किसी भी अतिरिक्त मॉड्यूल का उपयोग नहीं करता है। बस जहां आवश्यक हो उसे शामिल करें।

my $i = 1; 
print "Stack Trace:\n"; 
while ((my @call_details = (caller($i++)))){ 
    print $call_details[1].":".$call_details[2]." in function ".$call_details[3]."\n"; 
} 
संबंधित मुद्दे