在代码中放置$DB :: single = 1和$DB :: single = 2有什么区别?当我在perl调试器命令行上执行’c’时,两者似乎都具有停止执行后的执行相同的效果.
perldebug
表示,值1相当于刚刚按下“下一步”,2与“n”相同,但是如何达成声明有什么区别?
解决方法
从
perldebug
:
如果将$DB :: single设置为2,则相当于刚刚输入n命令(通过子程序调用执行),而值为1表示s命令(进入子程序调用).
你已经知道了
从用户的角度来看,我确信没有任何区别.我以此为基础来检查实际的DB.pm source code.
我们来逻辑地跟着.您可能需要参考源代码.我已经简化了一些代码,以消除不必要的细节,但是您应该可以从我的描述中获得想法.
当您在调试器中执行代码时,至少有两个重要的变量,即运行和单个.这些的组合是决定代码是否运行:
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()函数是为每一行执行的,它包含以下代码段,如果已经设置了单个行,它将停止运行(它总是执行当前行):
if ($DB::single) { $DB::single = 0; $running = 0; }
这就是为什么,如果你在Perl代码中设置变量,它会在下一行断开(通过break,我的意思是“停止运行代码”,而不是“损坏某种程度”)调试器.
当运行为0时,DB()函数进入这个小循环:
# Now sit in an event loop until something sets $running do { $c->idle; # call client event loop; must not block } until $running;
换句话说,它等待用户命令设置运行回到1.这可以通过以下三个功能之一完成:
sub next { $DB::single = 2; $running = 1; } sub step { $DB::single = 1; $running = 1; } sub cont { $DB::single = 0; $running = 1; }
您可以看到,这三个命令设置了单个和运行的不同组合,这将在执行下一个Perl行时使用(参见前面的表格,以了解这些组合是什么意思).
在Perl代码中使用1或2的能力是直接的结果,因为您使用一个鬼祟而聪明的技巧来从Perl代码本身中断执行,通过设置通常由调试器设置的变量命令.
这就是为什么不重要的价值,因为你强迫调试器处于特定状态.