2

使用内置的 Perl 调试器,我可以打印堆栈跟踪。但是,我只对某个变量感兴趣,而不是 30k+ 行的完整堆栈跟踪。是否可以只显示包含指定变量的执行行?

例子

假设我想跟踪变量 $data。然后我只想看到第 4,7,8,10 行而不是其他行。

use strict;
use warnings;

my $data = 1;
my $otherdata = "Diamond";

$data += 1;
my $rename = $data;

if($rename =~ /2/){

    print "hello world";

}

堆栈跟踪

perl -d:Trace script.pl

script.pl:4: my $data = 1;
script.pl:5: my $otherdata = "Diamond";
script.pl:7: $data += 1;
script.pl:8: my $rename = $data;
script.pl:10: if($rename =~ /2/){
script.pl:12:        print "hello world";
4

2 回答 2

0

我通过使用Variable::Magic找到了一个部分可行的解决方案。变量跟踪器(参见下面的代码)$wiz 附加到变量 $data。每当访问 $data 时,它都会调用“get”方法并执行 sub {print“875ABC8768”}。

use strict;
use warnings;
use Variable::Magic qw<wizard cast VMG_OP_INFO_NAME>;

my $data = 1;

{ # A variable tracer
my $wiz = wizard(
get  => sub { print "875ABC8768"},
 );

 cast $data, $wiz;
}

my $otherdata = "Diamond";

$data += 1;
my $rename = $data;

if($rename =~ /2/){

   print "hello world";

}

通过使用以下步骤,我能够提取包含变量 $data 的执行行:

1)将堆栈跟踪写入文件:

perl -d:Trace script.pl 2> stacktrace.txt

2) 提取带有变量 $data 的行:

use strict;
use warnings;

open(FILE,"<","stacktrace.txt");
my $previous = <FILE>;

     while (my $current = <FILE>) {

        if($current =~ /875ABC8768/){
            print $previous;
        }

        $previous = $current;
     }

close(FILE);

执行脚本:

perl extractor.pl

>> magic.pl:17: $data += 1;
>> magic.pl:18: my $rename = $data;
于 2015-11-21T10:03:21.427 回答
-1

您可以仅在包含变量的行号上附加(到跟踪命令)这种半自动过滤方式:

|egrep ":($(echo $(grep -n '$data\b' script.pl|cut -d: -f1)|tr ' ' '|')):"
于 2015-11-17T21:10:18.980 回答