Se ejecuta el programa con la opción RemotePort :
35  # ####################################################################################
36  # lhp@nereida:~/Lperl/src/properldebugging/Chapter09$ \
        PERLDB_OPTS="RemotePort=nereida:12345" perl -d hello.pl
37  # 4 5
38  #
En el otro lado se pone un servidor a esperar con  netcat :
9 #################################################################################### 10 # lhp@nereida:~/Lperl/src/properldebugging/Chapter09$ nc -v -l nereida -p 12345 11 # listening on [any] 12345 ... 12 # connect to [193.145.105.252] from nereida [193.145.105.252] 51615 13 # 14 # Loading DB routines from perl5db.pl version 1.28 15 # Editor support available. 16 # 17 # Enter h or `h h' for help, or `man perldebug' for more help. 18 # 19 # main::(hello.pl:4): my $a = 4; 20 # DB<1> n 21 # main::(hello.pl:5): my $b = 5; 22 # DB<1> p $a 23 # 4 24 # DB<2> n 25 # main::(hello.pl:6): print "$a $b\n"; 26 # DB<2> p $b 27 # 5 28 # DB<3> n 29 # Debugged program terminated. Use q to quit or R to restart, 30 # use o inhibit_exit to avoid stopping after program termination, 31 # h q, h R or h o to get additional info. 32 # DB<3> 33 34 lhp@nereida:~/Lperl/src/properldebugging/Chapter09$
El programa:
lhp@nereida:~/Lperl/src/properldebugging/Chapter09$ cat -n hello.pl 1 #!/usr/bin/perl -w 2 # Example of remote debugging 3 use strict; 4 5 my $a = 4; 6 my $b = 5; 7 print "$a $b\n"; 8
lhp@nereida:/tmp$ cat -n ipcssh2.pl
     1  #!/usr/local/bin/perl -w
     2  use strict;
     3  use IPC::PerlSSH;
     4
     5  my $ips = IPC::PerlSSH->new(
     6    Command => q{ssh nereida 'PERLDB_OPTS="RemotePort=nereida:12345" perl -d'},
     7  );
     8
     9  $ips->eval( "use POSIX qw( uname )" );
    10  my @remote_uname = $ips->eval( "uname()" );
    11
    12  print "@remote_uname\n";
lhp@nereida:/tmp$ ipcssh2.pl
@Linux nereida.deioc.ull.es 2.6.18-5-686 #1 SMP Mon Dec 24 16:41:07 UTC 2007 i686
lhp@nereida:/tmp$ nc  -v -l nereida -p 12345  
listening on [any] 12345 ...
connect to [193.145.105.252] from nereida [193.145.105.252] 48416
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::(-:58):   $| = 1;
  DB<1> n
main::(-:60):   my %stored_procedures;
  DB<1>
main::(-:70):   };
  DB<1>
main::(-:74):   };
  DB<1>
main::(-:76):   while( 1 ) {
  DB<1>
main::(-:77):      my ( $operation, @args ) = read_operation( $readfunc );
  DB<1>
main::(-:79):      if( $operation eq "QUIT" ) {
  DB<1>
main::(-:84):      if( $operation eq "EVAL" ) {
  DB<1> x $operation
0  'EVAL'
  DB<2> n
main::(-:85):         my $code = shift @args;
  DB<2> c
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<2> q
El programa:
pp2@nereida:~/LGRID_Machine/examples$ cat -n debug1.pl
 1  #!/usr/local/bin/perl -w
 2  use strict;
 3  use GRID::Machine;
 4
 5  my $hostport = shift || $ENV{GRID_REMOTE_MACHINE} || usage();
 6  $hostport =~ m{^([\w.]+)(?::(\d+))?$} or usage();
 7  my $host = $1;
 8  my $port = $2;
 9
10  my $machine = GRID::Machine->new(
11     host => $host,
12     debug => $port,
13     includes => [ qw{SomeFunc} ],
14  );
15
16  my $r =  $machine->eval(q{
17    use vars qw{$a $b $c};
18
19    $a = 4;
20    $b = 2*$a;
21    $c = $a+$b;
22    gprint "machine: ".hostname().": Inside first eval a = $a, b = $b, c = $c\n";
23  });
24
25  $r = $machine->max( 1, 4, 9, 12, 3, 7);
26  show($r);
27
28  $r =  $machine->eval(q{
29    gprint "machine: ".hostname().": Inside second eval\n";
30    gprint "$a $b $c\n";
31    $a+$b+$c;
32  });
33
34  show($r);
35
36  sub usage {
37    warn "Usage:\n$0 host[:port]\n";
38    exit(1);
39  }
40
41  sub show {
42    my $r = shift;
43
44    print $r."result = ".$r->result."\n"
45  }
El fichero someFunc.pm:
pp2@nereida:~/LGRID_Machine/examples$ cat -n SomeFunc.pm
     1  use List::Util qw{max};
     2  use Sys::Hostname;
     3
     4  sub max {
     5    gprint "machine: ".hostname().": Inside sub two(@_)\n";
     6    List::Util::max(@_)
     7  }
Ejecutar nc primero:
casiano@beowulf:~$ netcat -v -l -p 54321 listening on [any] 54321 ...Ejecutamos el programa:
pp2@nereida:~/LGRID_Machine/examples$ debug1.pl beowulf:54321 Debugging with 'ssh beowulf PERLDB_OPTS="RemotePort=beowulf:54321" perl -d' Remember to run 'netcat -v -l -p 54321' in beowulfAhora tendremos el prompt del depurador en la terminal en la que ejecutamos netcat:
casiano@beowulf:~$ netcat -v -l -p 54321 listening on [any] 54321 ... connect to [193.145.102.240] from beowulf.pcg.ull.es [193.145.102.240] 60473 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. GRID::Machine::MakeAccessors::(/home/pp2/LGRID_Machine/lib/GRID/Machine/MakeAccessors.pm:33): 33: 1; DB<1>
El fichero .perldb permite adaptar la conducta del depurador:
casiano@beowulf:~$ cat -n .perldb
 1  #sub ::beval {
 2  #  print DB::OUT 'b GRID::Machine::EVAL $_[1] =~ m{'.$_[0].'}'
 3  #}
 4
 5  sub ::get_stdout_name {
 6    my $a = `ls rperl*$$*.log`;
 7    chomp($a);
 8    $a;
 9  }
10
11  sub ::sys {
12    my $command = shift;
13
14    $var = `$command`;
15    print DB::OUT $var;
16  }
17
18  #our %alias;
19  $alias{beval} = 's/beval\s+(.+)/b GRID::Machine::EVAL \$_[1] =~ m{$1}/';
20  $alias{bsub}  = 's/bsub\s+(.+)/b GRID::Machine::CALL \$_[1] =~ m{$1}/';
21  $alias{fg}  = 's/fg\s+(\d+)/f eval $1/';
22  $alias{whatf} = 's/whatf\s+(.+)/x SERVER->{stored_procedures}{$1}/';
23  $alias{stdout} = q{s/stdout/::get_stdout_name()/e};
24  $alias{cgs} = 's/cgs\s+(.+)/c GRID::Machine::$1/';
25  $alias{'!!'} = 's/!!\s*(.+)/p `$1`/';
26  $alias{main} = 's/main/c GRID::Machine::main/';
27  $alias{new} = 's/new/c GRID::Machine::new/';
pp2@nereida:~/LGRID_Machine/examples$ cat -n netcat3.pl
     1  #!/usr/local/bin/perl -w
     2  use strict;
     3  use GRID::Machine;
     4
     5  my $machine = GRID::Machine->new(
     6     command => q{ssh beowulf 'PERLDB_OPTS="RemotePort=beowulf:12345" perl -d'},
     7     #command => q{ssh nereida perl},
     8  );
     9
    10  print $machine->eval(q{
    11    system('ls');
    12    print %ENV,"\n";
    13  });
    14
    15  __END__
En la máquina remota ejecutamos primero
netcat
casiano@beowulf:~$ nc -v -l beowulf -p 12345 listening on [any] 12345 ...Ahora arrancamos el programa en la terminal que tenemos en nereida:
pp2@nereida:~/LGRID_Machine/examples$ netcat3.pl
En la terminal de netcat nos aparece el depurador:
connect to [193.145.102.240] from beowulf.pcg.ull.es [193.145.102.240] 48308
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.
GRID::Machine::MakeAccessors::(/usr/local/share/perl/5.8.8/GRID/Machine/MakeAccessors.pm:33):
33:     1;
  DB<1> n
GRID::Machine::(/usr/local/share/perl/5.8.8/GRID/Machine/Message.pm:74):
74:     1;
  DB<1> c GRID::Machine::main
GRID::Machine::main(/usr/local/share/perl/5.8.8/GRID/Machine/REMOTE.pm:508):
508:      my $server = shift;
  DB<2> n
GRID::Machine::main(/usr/local/share/perl/5.8.8/GRID/Machine/REMOTE.pm:514):
514:      package main;
  DB<2>
GRID::Machine::main(/usr/local/share/perl/5.8.8/GRID/Machine/REMOTE.pm:515):
515:      while( 1 ) {
  DB<2>
GRID::Machine::main(/usr/local/share/perl/5.8.8/GRID/Machine/REMOTE.pm:516):
516:         my ( $operation, @args ) = $server->read_operation( );
  DB<2>
GRID::Machine::main(/usr/local/share/perl/5.8.8/GRID/Machine/REMOTE.pm:518):
518:         if ($server->can($operation)) {
  DB<2> x ( $operation, @args )
0  'GRID::Machine::EVAL'
1  'use strict;'
2  ARRAY(0x86820fc)
     empty array
  DB<3> c
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> q
casiano@beowulf:~$
Y la salida ocurre en la terminal de netcat:
Algorithm-Knap01DP-0.25 Algorithm-Knap01DP-0.25.tar .................. HOME/home/casianoSSH_CLIENT193.145.105.252 42097....
 
