5

WindowsXPでActivePerl5.8を使用しています。

use strict;
use warnings;
use Data::Dumper;

私のスクリプトで使用されているサブルーチンは3つあります。

print "some location";コールスタックを検出するために、私はいくつかを挿入し、コンソールウィンドウから印刷結果を確認することしかできません。

それを監視するための良い方法はありますか?ありがとうございました。

4

4 に答える 4

10

それがあなたのコードである場合は、次を使用することをお勧めします。

Carp::cluck( "And here's the stack:" );

を参照してくださいCarp::cluck。スタック トレースで警告を出力します。これは、デバッグ出力の「printf」スタイルのように機能します。

于 2010-01-08T03:04:45.270 に答える
9

デバッガーの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
于 2010-01-08T02:09:13.553 に答える
5

コールスタックを監視して登録者を追跡する理由について具体的ではなかったため、回答は幅広くする必要があります。

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コンパイラモジュールを使用して現実にマッピングされます。本当に役立つためにはより良いバックエンドを必要とするステートメントプロファイリング機能もあります。

あなたがやりたいことについて私たちに話すほど、私たちの答えはあなたにとってより役に立ちます!

于 2010-01-08T17:10:07.163 に答える
0

Perl でコール スタックを直接管理する必要はほとんどありません。あなたがするならcaller、あなたが望むツールです。ただし、これが必要になることはめったにありません。

多くの場合、デバッグ中にスタック トレースを見たいと思います。良いニュースです。スタック トレースを取得するのは簡単です。単純にCarpconfessandcluck関数をdieandの代わりに使用し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
于 2010-01-11T07:17:39.707 に答える