我希望能够(合理地)在Perl调试器中任意设置我的执行点.例如,在if的主体之前移动if并设置变量.
围绕perldebug(以及perldebguts和perl调试器POD)页面进行翻查表明,这种功能要么不受支持,要么没有记录.
解决方法
一个繁琐的解决方法是在整个代码中添加标签和条件goto语句.但是,根据您想要模拟此功能的严重程度,它可能是值得的.
POINT1: $GOTO=""; # $GOTO is our fake variable that we only set from the debugger ($a,$b,$c)=(1,2,3); POINT2: $GOTO=""; if ($a < $b) { goto $GOTO if $GOTO; if ($a > $c) { goto $GOTO if $GOTO; print "foo\n"; } else { goto $GOTO if $GOTO; print "bar\n"; } goto $GOTO if $GOTO; } else { goto $GOTO if $GOTO; print "nothing\n"; goto $GOTO if $GOTO; }
示例调试会话:
$perl -d debuggoto.pl Loading DB routines from perl5db.pl version 1.28 Editor support available. Enter h or `h h' for help,or `man perldebug' for more help. main::(debuggoto.pl:1): POINT1: $GOTO=""; # $GOTO is our fake variable that we only set from the debugger DB<1> n main::(debuggoto.pl:2): ($a,3); DB<1> main::(debuggoto.pl:3): POINT2: $GOTO=""; DB<1> main::(debuggoto.pl:4): if ($a < $b) { DB<1> main::(debuggoto.pl:5): goto $GOTO if $GOTO; DB<1> main::(debuggoto.pl:6): if ($a > $c) { DB<1> main::(debuggoto.pl:10): goto $GOTO if $GOTO; DB<1> main::(debuggoto.pl:11): print "bar\n"; DB<1> bar main::(debuggoto.pl:13): goto $GOTO if $GOTO; DB<1> $GOTO="POINT2" DB<2> n main::(debuggoto.pl:3): POINT2: $GOTO=""; DB<2> $c=0 DB<3> n main::(debuggoto.pl:4): if ($a < $b) { DB<3> main::(debuggoto.pl:5): goto $GOTO if $GOTO; DB<3> main::(debuggoto.pl:6): if ($a > $c) { DB<3> main::(debuggoto.pl:7): goto $GOTO if $GOTO; DB<3> main::(debuggoto.pl:8): print "foo\n"; DB<3> foo main::(debuggoto.pl:13): goto $GOTO if $GOTO; DB<3> Debugged program terminated. Use q to quit or R to restart,use o inhibit_exit to avoid stopping after program termination,h q,h R or h o to get additional info. DB<3> Use `q' to quit or `R' to restart. `h q' for details. DB<3>
我想知道是否有可能构建一个使用这个想法的调试器.