Perl отладчик: переменная трассировки в stacktrace

С помощью встроенного отладчика 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";

2 ответа

Я нашел частично работающее решение с помощью Variable:: Magic. Переменная tracer (см. Код ниже) $ 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;

Вы можете просто добавить (к команде trace) этот полуавтоматический способ фильтрации только тех номеров строк, которые содержат переменную:

|egrep ":($(echo $(grep -n '$data\b' script.pl|cut -d: -f1)|tr ' ' '|')):"
Другие вопросы по тегам