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