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

Fli*_*imm 3 debugging perl watch

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

Fli*_*imm 14

您可以使用wPerl调试器中的命令创建监视点.

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

通过键入w然后是将监视更改的表达式来创建监视表达式:

DB<1> w $variablename
Run Code Online (Sandbox Code Playgroud)

输入c以继续,直到观察的表达式发生变化.完成后,您将获得类似于此的输出:

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

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

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

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

如果随后将变量更改为空字符串,则调试器将不会停止,因为字符串化的空字符串和字符串化的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";
Run Code Online (Sandbox Code Playgroud)

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

要删除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}
Run Code Online (Sandbox Code Playgroud)

提示:使用 Data::Dumper

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

DB<1> w Data::Dumper->Dump([$hashref])
Run Code Online (Sandbox Code Playgroud)

这比简单更好w $hashref,因为它会在散列值改变时停止,而不是简单地指向引用指向的地址(因为hashref字符串化为类似的东西HASH(0x2a07a90)).