5

我在 Windows XP 上使用 ActivePerl 5.8。

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

我的脚本中使用了三个子例程。

要检测调用堆栈,我只能插入一些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

您没有具体说明为什么要监视调用堆栈并跟踪您的潜艇,因此答案必须广泛。

一种方法是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 函数收集的,该函数计算每个 op 执行的次数。然后使用 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 回答