使用Perl调试器,我知道我可以使用b
命令在某些代码行设置断点。一旦变量的内容发生变化,我可以立即停止调试器吗?
答案 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 ++调试器等变量。