2013-12-12 60 views
1

我试着用Devel::Trace来获取perl堆栈跟踪信息,用它作为代码的调试器。Perl Stack Trace(Devel :: Trace)

perl -d:Trace <pgm> 

使用$Devel::Trace::TRACE = 0;Devel::Trace::trace('on'); Perl代码内也试过。但我无法得到踪迹。

有人可以举例说明在Perl代码中使用Devel::Trace

回答

3

Devel::Trace不会产生堆栈跟踪。相反,它会打印出当前正在执行的语句。例如:

$ cat script.pl 
    use feature 'say'; 
    my $foo = "bar"; 
    say $foo; 
$ perl -d:Trace script.pl 
>> script.pl:2:  my $foo = "bar"; 
>> script.pl:3:  say $foo; 
bar 

里面的代码,您可以打开跟踪和关闭特定的区域:

$ cat script.pl 
    use feature 'say'; 
    my $foo = "bar"; 
    for my $n (1 .. 3) { 
     local $Devel::Trace::TRACE = 0; 
     say $foo x $n; 
    } 
    say "That were some ${foo}s"; 
$ perl -d:Trace script.pl 
>> script.pl:2:  my $foo = "bar"; 
>> script.pl:3:  for my $n (1 .. 3) { 
>> script.pl:4:  local $Devel::Trace::TRACE = 0; 
bar 
>> script.pl:4:  local $Devel::Trace::TRACE = 0; 
barbar 
>> script.pl:4:  local $Devel::Trace::TRACE = 0; 
barbarbar 
>> script.pl:7:  say "That were some ${foo}s"; 
That were some bars 

正如你所看到的,say $foo x $n线不包括在跟踪输出当我转身的在该范围内追踪。

如果你想有一个堆栈跟踪(如“调用堆栈跟踪”),然后使用Carp模块:

$ cat script.pl 
    use Carp(); 

    foo("Hello World"); 

    sub foo { bar(@_) } 
    sub bar { baz(@_) } 
    sub baz { qux(@_) } 
    sub qux { Carp::cluck "Howdy!" } 
$ perl script.pl 
Howdy! at so1.pl line 8. 
     main::qux('Hello World') called at script.pl line 7 
     main::baz('Hello World') called at script.pl line 6 
     main::bar('Hello World') called at script.pl line 5 
     main::foo('Hello World') called at script.pl line 3 
+0

谢谢!这真的很好。我可以在不使用'perl -d:Trace'的情况下打印出当前正在执行的语句吗?我能够在代码中调用它吗? –

+1

@AmanVidura在正常执行过程中打印每条语句通常不会很有用 - 它只是一个调试帮助。你可以通过'BEGIN {$ Devel :: Trace :: TRACE = 0}'在开始处禁用跟踪,然后通过'local $ Devel :: Trace :: TRACE = 1在你感兴趣的范围中重新允许它。 '。无论如何,这个模块依赖于perl解释器的调试功能,并且在没有启用调试的情况下将无法工作 - 它基本上在每个语句之前设置一个断点,这会降低性能。 – amon