Perlは、debugging hooksを提供し、コンパイルされたソースファイルの生の行を表示できます。サブルーチンが呼び出されるたびに元の行を出力するカスタムデバッガを書くことができます。
次に、一致させる1つ以上のサブルーチンを指定します。一致するサブルーチンが呼び出されるたびに、対応する行が印刷されます。
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/);
実行:これが唯一の最初の行を印刷すること
$ 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) –