WindowsXPでActivePerl5.8を使用しています。
use strict;
use warnings;
use Data::Dumper;
私のスクリプトで使用されているサブルーチンは3つあります。
print "some location";
コールスタックを検出するために、私はいくつかを挿入し、コンソールウィンドウから印刷結果を確認することしかできません。
それを監視するための良い方法はありますか?ありがとうございました。
それがあなたのコードである場合は、次を使用することをお勧めします。
Carp::cluck( "And here's the stack:" );
を参照してくださいCarp::cluck
。スタック トレースで警告を出力します。これは、デバッグ出力の「printf」スタイルのように機能します。
デバッガーのT
コマンドを使用します。
例:
$ perl -d -e'
sub foo {}
sub bar { foo; }
bar;
'
Loading DB routines from perl5db.pl version 1.32
Editor support available.
Enter h or `h h' for help, or `man perldebug' for more help.
main::(-e:4): bar;
DB<1> s
main::bar(-e:3): sub bar { foo; }
DB<1> s
main::foo(-e:2): sub foo {}
DB<1> T
. = main::foo() called from -e line 3
. = main::bar() called from -e line 4
DB<1> s
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
DB<1> q
コールスタックを監視して登録者を追跡する理由について具体的ではなかったため、回答は幅広くする必要があります。
1つの方法はcaller
:
発信者
現在のサブルーチン呼び出しのコンテキストを返します。スカラーコンテキストでは、呼び出し元が存在する場合、つまり、サブルーチン、eval、requireにいる場合は呼び出し元のパッケージ名を返し、それ以外の場合は未定義の値を返します。リストコンテキストでは、
# 0 1 2 ($package, $filename, $line) = caller;
EXPRを使用すると、デバッガーがスタックトレースを出力するために使用する追加情報が返されます。EXPRの値は、現在の呼び出しフレームの前に戻る呼び出しフレームの数を示します。
# 0 1 2 3 4 ($package, $filename, $line, $subroutine, $hasargs, # 5 6 7 8 9 10 $wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash) = caller($i);
Devel :: Coverモジュールを使用することもできます:
コードカバレッジデータは、各操作が実行された回数をカウントするプラグ可能なrunops関数を使用して収集されます。これらのデータは、Bコンパイラモジュールを使用して現実にマッピングされます。本当に役立つためにはより良いバックエンドを必要とするステートメントプロファイリング機能もあります。
あなたがやりたいことについて私たちに話すほど、私たちの答えはあなたにとってより役に立ちます!
Perl でコール スタックを直接管理する必要はほとんどありません。あなたがするならcaller
、あなたが望むツールです。ただし、これが必要になることはめったにありません。
多くの場合、デバッグ中にスタック トレースを見たいと思います。良いニュースです。スタック トレースを取得するのは簡単です。単純にCarpのconfess
andcluck
関数をdie
andの代わりに使用しwarn
ます。
use strict;
use warnings;
use Carp;
bar(6.1);
bar(1);
sub foo {
confess "Oh noes" unless @_ == 6; # confess is fatal
}
sub bar {
my $count = shift;
cluck "bar is in trouble" unless int $count == $count; # cluck is not fatal
foo( ('a')x $count );
}
これにより、次のことが得られます。
dao:~ toad$ perl test.pl
bar is in trouble at test.pl line 14
main::bar(6.1) called at test.pl line 5
Oh noes at test.pl line 9
main::foo('a') called at test.pl line 15
main::bar(1) called at test.pl line 6