我想跟踪我的Perl脚本,但只跟踪w->Say()
包中的代码,并将输出重定向到文件。
使用main
启动脚本时,它将进入交互模式。
我试过了
perl -d script.pl
但这也跟踪了我不想要的所有子程序和模块。
我正在寻找类似bash perl -d:Trace perl_05.pl 2&> output.log
或set -o xtrace
的内容。
答案 0 :(得分:6)
文章Trace your Perl programs解决了您对跟踪量的担忧,并向您展示了一种调整输出的方法,以便您只追踪自己想要的内容。
您可以创建自己的一次性模块,以准确追踪您想要的内容。由于当前目录通常已在
@INC
,因此您可以创建Devel/MyTrace.pm
。
完全读取它以查看作者如何修改跟踪函数的默认行为,首先将跟踪输出到文件,然后输出到STDERR,最后将输出限制为仅跟踪主文件。
您可以更进一步排除除主文件之外的所有代码:
use v5.10; use autodie; BEGIN { my $trace_file = $ENV{TRACE_FILE} // "mytrace.$$"; print STDERR "Saving trace to $trace_file\n"; 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;
最后一段代码是对你特别感兴趣的代码。它完全符合您的要求。
答案 1 :(得分:5)
将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
)的作者