【发布时间】:2014-02-15 20:23:22
【问题描述】:
使用 Perl 调试器,我知道我可以使用 b 命令在某些代码行设置断点。我可以让调试器在变量的内容发生更改后立即停止吗?
【问题讨论】:
使用 Perl 调试器,我知道我可以使用 b 命令在某些代码行设置断点。我可以让调试器在变量的内容发生更改后立即停止吗?
【问题讨论】:
此外,您可以在 Linux 中使用"ddd your_script.pl&",并在 GUI 中观察 C/C++ 调试器等变量。
【讨论】:
您可以在 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 $$ 在进入分叉子项时中断