我想跟踪我的Perl脚本,但只跟踪main
包中的代码,并将输出重定向到一个文件。
当使用perl -d script.pl
启动脚本时,它将进入交互模式。
我试过
perl -d:Trace perl_05.pl 2&> output.log
但这也跟踪了我不想要的所有子例程和模块。
我正在寻找类似bash set -o xtrace
或sh -x
的东西。
文章Trace your Perl程序解决了您对跟踪数量的担忧,并向您展示了一种调整输出的方法,以便您只跟踪您想要的内容。
您可以创建自己的一次性模块来精确地跟踪您想要的内容。由于当前目录通常已经在
@INC
中,因此可以创建一个Devel/MyTrace.pm
。
完全阅读它,看看作者如何修改跟踪函数的默认行为,首先将跟踪输出到文件,然后也输出到STDERR,最后将输出限制为只跟踪主文件。
您可以进一步排除除主文件以外的所有代码:
use v5.10; use autodie; BEGIN { my $trace_file = $ENV{TRACE_FILE} // "mytrace.$$"; print STDERR "Saving trace to $trace_filen"; my $fh = do { if( $trace_file eq '-' ) { *STDOUT } elsif( $trace_file eq 'STDERR' ) { *STDERR } else { open my $fh, '>>', $trace_file; $fh; } }; sub DB::DB { my( $package, $file, $line ) = caller; return unless $file eq $0; my $code = @{"::_<$file"}; print $fh "[@{[time]}] $file $l $code->[$line]"; } } 1;
最后一段代码是您特别感兴趣的代码。它正是你想要的。
将perl与Devel::DumpTrace
一起使用与使用bash -x
非常相似。与bash -x
一样,Devel::DumpTrace
扩展并输出变量值,让您了解脚本在做什么,而不仅仅是在哪里做
它还具有您正在寻找的功能:启用和禁用对特定包的跟踪。对于您的用例,您可以像一样运行它
perl -d:DumpTrace=-.*,+main my_script.pl
或
perl -d:DumpTrace=-.* my_script.pl
-.*
的意思是"将所有与/^.*$/
匹配的包排除在跟踪之外",也就是说,所有包。+main
的意思是"将包main
包括在跟踪中"。
默认输出可能相当冗长。如果你想要比这更少的输出,你可以指定quiet
模式:
perl -d:DumpTrace=quiet,-.*,+main my_script.pl
(我是Devel::DumpTrace
的作者)