Perl предоставляет специальные debugging hooks, которые позволяют видеть исходные строки скомпилированных исходных файлов. Вы можете написать собственный отладчик, который печатает исходную строку каждый раз при вызове подпрограммы.
Ниже вы можете указать одну или несколько подпрограмм, которые вы хотите сопоставить; каждый раз, когда вызывается соответствующая подпрограмма, выводится соответствующая строка.
package Devel::ShowCalls;
our %targets;
sub import {
my $self = shift;
for (@_) {
# Prepend 'main::' for names without a package specifier
$_ = "main::$_" unless /::/;
$targets{$_} = 1;
}
}
package DB;
sub DB {
($package, $file, $line) = caller;
}
sub sub {
print ">> $file:$line: ",
${ $main::{"_<$file"} }[$line] if $Devel::ShowCalls::targets{$sub};
&$sub;
}
1;
Для трассировки вызовов функций foo
и Baz::qux
в следующей программе:
sub foo {}
sub bar {}
sub Baz::qux {}
foo(now => time);
bar rand;
Baz::qux(qw/unicorn pony waffles/);
Run:
$ perl -d:ShowCalls=foo,Baz::qux myscript.pl
>> myscript.pl:5: foo(now => time);
>> myscript.pl:7: Baz::qux(qw/unicorn pony waffles/);
Обратите внимание, что это будет печатать только первую строку из вызов, поэтому он не будет работать для звонков, таких как
foo(bar,
baz);
Другой пример: скажем, вы хотели выполнить 'test (time)'. Просто печать '@ _' будет печатать значение эпохи текущего времени и очень неясно (на первый взгляд), что вы на самом деле проверяете текущее время. – tjwrona1992
Используйте [Devel :: Trace] (https://metacpan.org/pod/Devel::Trace) или просто используйте обычный отладчик и перерыв в строке, где вызывается функция. – ThisSuitIsBlackNot
См. Также ['Debug :: Show'] (https://metacpan.org/pod/Debug::Show), [' PadWalker'] (https://metacpan.org/pod/PadWalker), ['Данные :: Dumper :: Names'] (https://metacpan.org/pod/Data::Dumper::Names), ['Data :: Dumper :: Lazy'] (https://metacpan.org/pod/ Data :: Dumper :: Lazy) и ['Debug :: ShowStuff :: ShowVar'] (https://metacpan.org/pod/Debug::ShowStuff::ShowVar) –