【问题标题】:In perl, what is the difference between $DB::single = 1 and 2?在 perl 中,$DB::single = 1 和 2 有什么区别?
【发布时间】:2011-05-28 05:14:40
【问题描述】:

在您的代码中添加$DB::single=1$DB::single=2 有什么区别?当我在 perl 调试器命令行上执行“c”时,两者似乎都具有相同的效果,即在赋值后的语句处暂停执行。

perldebug 表示值 1 相当于刚刚按下 's' 进入下一条语句,而 2 与 'n' 相同,但它与你进入语句的方式有什么不同?

【问题讨论】:

    标签: perl


    【解决方案1】:

    来自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() 函数对每一行执行,它包含以下 sn-p,如果设置了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 代码中中断执行这一事实的直接结果本身,通过设置一个通常由调试器命令设置的变量。

    这就是为什么重要的不是值,而是您强制调试器进入特定状态这一事实。

    【讨论】:

    • 现在可能有很好的文档记录,但我认为这是 DB.pm 工作方式的一个简单副作用,有人发现它很有用(甚至如果那个人是原作者)。没有人会设计这样的 API :-) 他们会提供一个函数来做到这一点,以免暴露内部工作原理,而不仅仅是让变量设置为两个不同的值,这些值之间的差异在使用方面绝对没有。
    猜你喜欢
    • 2012-02-13
    • 2011-12-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2017-08-03
    • 2018-08-06
    相关资源
    最近更新 更多