【问题标题】:How can I watch for changes to an expression in the Perl debugger?如何在 Perl 调试器中观察表达式的变化?
【发布时间】:2014-02-15 20:23:22
【问题描述】:

使用 Perl 调试器,我知道我可以使用 b 命令在某些代码行设置断点。我可以让调试器在变量的内容发生更改后立即停止吗?

【问题讨论】:

    标签: perl debugging watch


    【解决方案1】:

    此外,您可以在 Linux 中使用"ddd your_script.pl&",并在 GUI 中观察 C/C++ 调试器等变量。

    【讨论】:

      【解决方案2】:

      您可以在 Perl 调试器中使用 w 命令创建观察点。

      w 调试器命令速成课程:

      通过输入w 创建一个监视表达式,然后输入一个将监视更改的表达式:

      DB<1> w $variablename
      

      输入c 以继续,直到观察到的表情发生变化。完成后,您将获得类似以下的输出:

      DB<2> c
      Watchpoint 0:   $variablename changed:
          old value:  ''
          new value:  'hi'
      main::(ex.pl:6):    $variablename = "";    
      

      请注意,调试器在更改发生后停止在语句处,因此显示的行可能根本不相关。

      另请注意,表达式是字符串化。因此,例如,将变量更改为 undef 将为您提供以下输出:

        DB<2> c
      Watchpoint 0:   $variablename changed:
          old value:  'hi'
          new value:  ''
      main::(ex.pl:7):    $variablename = undef;
      

      如果变量随后更改为空字符串,调试器不会停止,因为字符串化的空字符串和字符串化的 undef 被认为是相等的

      如果监视表达式是一个列表,调试器将比较列表的字符串化元素:

        DB<1> w $variablename, "second"
      
        DB<2> c
      Watchpoint 0:   $variablename, "second" changed:
          old value:  'one', 'second'
          new value:  'two', 'second'
      main::(hi.pl:6):    $variablename = "three";
      

      您可以使用数组变量或哈希变量作为监视表达式,它们将被视为任何其他列表。

      要删除监视表达式,请使用W 命令,要查看活动监视表达式列表,请使用L 命令。

      提示:使用临时全局变量

      由于每个语句都会重新评估监视表达式,因此您不能期望使用词法变量的监视表达式超出范围。一个快速提示是创建一个对词汇的全局引用,并改为跟踪它:

      DB<1> $main::my_debug_variable = $hashref_lexical_variable
      
      DB<2> w $main::my_debug_variable->{key_im_watching}
      

      提示:使用Data::Dumper

      使用Data::Dumper 观察非标量的内容:

      DB<1> w Data::Dumper->Dump([$hashref])
      

      这比简单的w $hashref 更可取,因为它会在哈希值更改时停止,而不是简单地引用所指向的地址(因为哈希引用字符串化为HASH(0x2a07a90) 之类的东西)。

      【讨论】:

      • 最后两个技巧很棒!
      • 另一个提示:w $$ 在进入分叉子项时中断
      • Programming Perl(第 4 版,第 3 版,2013-12-13)中,声称“w”列出源代码,与 1991 年第一版相同(似乎是'v' 现在(Perl 版本 5.30))。那是写这个答案的一个月前。它是什么时候从“w”变成“v”的? 1994 年使用 Perl 5?
      • 好的,我找到了。根据文档,'w' 被重新分配给Perl version 5.7.3 (2002-03-05) 中的监视表达式。在Perl version 5.7.2 (2001-07-13) 中,'w' 仍用于源列表。这本书严重过时 wrt。到 Perl 调试器(对于应该有它的版本(第 4 版),在出版时(2012 年 2 月)已经过时了将近 10 年)。
      • 感谢@PeterMortensen。随时编辑我的答案以更新它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 2016-04-09
      • 2011-08-12
      • 2013-03-31
      • 2016-11-30
      • 1970-01-01
      相关资源
      最近更新 更多