如何在Perl调试器中查看表达式的更改?

时间:2014-01-24 18:09:39

标签: perl debugging watch

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

2 个答案:

答案 0 :(得分:14)

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

w调试器命令的崩溃过程:

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

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";

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

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

提示:使用临时全局变量

由于watch-expression是使用每个语句重新计算的,因此您不能指望使用词法变量的watch-expression超出范围。一个快速提示是创建一个词汇的全局引用,并跟踪它:

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更可取,因为它会在哈希值的变化时停止,而不是简单地引用引用的地址(因为hashref字符串化为类似HASH(0x2a07a90)的东西)

答案 1 :(得分:0)

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