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

ave*_*lon 6 debugging perl

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

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

我试过了

perl -d:Trace perl_05.pl 2&> output.log
Run Code Online (Sandbox Code Playgroud)

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

我正在寻找类似bash set -o xtrace或者的东西sh -x.

eba*_*les 6

跟踪您的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_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;
Run Code Online (Sandbox Code Playgroud)

最后一段代码是特别有趣的代码.它完全符合你的要求.


mob*_*mob 5

使用perl Devel::DumpTrace非常类似于使用bash -x.比如bash -x,Devel::DumpTrace扩展和输出变量值,让您了解您的脚本正在做什么,而不仅仅是它在做什么.

它还具有您正在寻找的功能:启用和禁用特定包上的跟踪.对于您的用例,您可以运行它

perl -d:DumpTrace=-.*,+main my_script.pl
Run Code Online (Sandbox Code Playgroud)

要么

perl -d:DumpTrace=-.* my_script.pl
Run Code Online (Sandbox Code Playgroud)

-.*表示"排除所有与/^.*$/跟踪匹配的包",也就是说,所有包.+main表示"包括main跟踪包".

默认输出可能相当冗长.如果您希望输出少于此值,则可以指定quiet模式:

perl -d:DumpTrace=quiet,-.*,+main my_script.pl
Run Code Online (Sandbox Code Playgroud)

(我是作者Devel::DumpTrace)