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....