How to move instruction point in Perl debugger?

I would like to be able to (reasonably) arbitrarily set the execution point in the Perl debugger. For example, moving immediately before the if if from the if body and setting the variable.

The overheating of the perldebug page (both perldebguts and perl debugger POD) suggests that this kind of functionality is either not supported or not documented.

+5
source share
4 answers

An extensive workaround would be to add shortcuts and conditional expressions gotothroughout the code. But depending on how much you want to emulate this function, it may be worth it.

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

Example debugging session:

$ 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,$b,$c)=(1,2,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>

, , .

+1

, , , runloop, , , , .

runloop to cargo-cult - Runops::Switch. switch , ops, , ; runloop, op.

: http://cpansearch.perl.org/src/RGARCIA/Runops-Switch-0.04/Switch.xs

, runloop. goto , .

+1

Breakpoints can only be set on the first line of the statement.

0
source

This cannot be done with an existing debugger.

-1
source

All Articles