在perl中,$ DB :: single = 1和2之间有什么区别?

时间:2010-12-20 11:42:07

标签: perl

在代码中放置$DB::single=1$DB::single=2有什么区别?当我在perl调试器命令行上执行'c'时,两者似乎都具有在赋值后停止执行的相同效果。

perldebug表示值为1相当于只按了's'进入下一个语句,而2与'n'相同,但它与你如何达到声明?

1 个答案:

答案 0 :(得分:17)

来自perldebug

如果将$DB::single设置为2,则相当于只输入n命令(通过子程序调用执行),而值1表示s命令(进入子程序调用)。

你已经知道了很多。


从用户的角度来看,我很确定没有区别。我的基础是对实际DB.pm source code进行检查。

让我们逻辑地遵循这一点。您可能想参考源代码。我已经简化了一些代码来删除不必要的细节,但你应该能够从我的描述中得到这个想法。

当您在调试器中执行代码时,(至少)有两个重要变量runningsingle。这些的组合决定了代码是否运行:

running  single  description
-------  ------  -----------
   0       ?     not running
   1       0     running flat-out
   1       1     single stepping, execute into function
   1       2     single stepping, execute over function

对每一行执行DB()函数,它包含以下代码段,如果设置了single,它将停止运行(无论如何总是执行当前行):

if ($DB::single) {
    $DB::single = 0;
    $running = 0;
}

这就是为什么,如果你在你的Perl代码中设置变量,它会在下一行中断(通过中断,我的意思是“停止运行代码”,而不是“以某种方式损坏”)调试器。

running0时,DB()函数会进入此小循环:

# Now sit in an event loop until something sets $running
do {
    $c->idle;          # call client event loop; must not block
} until $running;

换句话说,它等待用户命令将running设置回1。这可以通过以下三个功能之一来完成:

sub next {
    $DB::single = 2;
    $running = 1;
}

sub step {
    $DB::single = 1;
    $running = 1;
}

sub cont {
    $DB::single = 0;
    $running = 1;
}

您可以看到这三个命令设置了singlerunning的不同组合,这些组合将在执行下一个Perl行时使用(请参阅前面的表格以了解这些组合的含义)。

在Perl代码中使用12的能力直接导致您使用偷偷摸摸但聪明的技巧来中断执行从你的Perl代码本身,通过设置一个通常由调试器命令设置的变量。

这就是为什么重要的不是因为你强迫调试器进入特定状态这一事实。