【发布时间】:2011-05-28 05:14:40
【问题描述】:
在您的代码中添加$DB::single=1 和$DB::single=2 有什么区别?当我在 perl 调试器命令行上执行“c”时,两者似乎都具有相同的效果,即在赋值后的语句处暂停执行。
perldebug 表示值 1 相当于刚刚按下 's' 进入下一条语句,而 2 与 'n' 相同,但它与你进入语句的方式有什么不同?
【问题讨论】:
标签: perl
在您的代码中添加$DB::single=1 和$DB::single=2 有什么区别?当我在 perl 调试器命令行上执行“c”时,两者似乎都具有相同的效果,即在赋值后的语句处暂停执行。
perldebug 表示值 1 相当于刚刚按下 's' 进入下一条语句,而 2 与 'n' 相同,但它与你进入语句的方式有什么不同?
【问题讨论】:
标签: perl
来自perldebug:
如果将$DB::single 设置为2,则相当于刚刚键入了n 命令(通过子程序调用执行),而1 的值表示s 命令(进入子程序电话)。
你已经知道了这么多。
从用户的角度来看,我很确定没有区别。我基于对实际 DB.pm source code 的检查。
让我们按照逻辑进行。您可能需要参考源代码。我已经简化了一些代码以删除不必要的细节,但你应该能够从我的描述中得到这个想法。
当您在调试器中执行代码时,(至少)有两个重要的变量,running 和 single。这些的组合决定了代码是否运行:
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() 函数对每一行执行,它包含以下 sn-p,如果设置了single,它将停止运行(无论如何它总是执行当前行):
if ($DB::single) {
$DB::single = 0;
$running = 0;
}
这就是为什么,如果您在 Perl 代码中设置变量,它将在下一行中断调试器(通过中断,我的意思是“停止运行代码”,而不是“以某种方式损坏”)。
当running 为0 时,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;
}
您可以看到这三个命令设置了 single 和 running 的不同组合,将在执行下一行 Perl 时使用(请参阅前面的表格以了解这些组合的含义)。
在您的 Perl 代码中使用 1 或 2 的能力是您使用 狡猾但聪明的技巧从 Perl 代码中中断执行这一事实的直接结果本身,通过设置一个通常由调试器命令设置的变量。
这就是为什么重要的不是值,而是您强制调试器进入特定状态这一事实。
【讨论】: