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

时间:2016-05-03 06:30:30

标签: perl debugging

我想跟踪我的Perl脚本,但只跟踪w->Say()包中的代码,并将输出重定向到文件。

使用main启动脚本时,它将进入交互模式。

我试过了

perl -d script.pl

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

我正在寻找类似bash perl -d:Trace perl_05.pl 2&> output.log set -o xtrace的内容。

2 个答案:

答案 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)的作者