如何仅从Perl程序的主包中获取跟踪输出



我想跟踪我的Perl脚本,但只跟踪main包中的代码,并将输出重定向到一个文件。

当使用perl -d script.pl启动脚本时,它将进入交互模式。

我试过

perl -d:Trace perl_05.pl 2&> output.log

但这也跟踪了我不想要的所有子例程和模块。

我正在寻找类似bash set -o xtracesh -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的作者)

最新更新