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 ' ' '|')):"