#!/usr/bin/perl =head1 NAME ebug-client - Debugger client for remote debugging Perl script =head1 SYNOPSIS ebug-client -key -port =head1 DESCRIPTION ebug-client is an debugger front end for attaching to remotely executing perl script, running on ebug-server. To invoke ebug-client, you must first invoke ebug-server to run debuggee and generate "key" and "port" needed for connection. When ebug-server is invoked, it will show exact command-line to invoke ebug-client. =head1 EXAMPLE # Attach to ebug-server running on port 4023, with key "begripra" $ ebug-client -key begripra -port 4023 =head1 NOTE Currently, you cannot "restart" debuggee. You'll need to restart one manually by re-invoking both ebug-server and ebug-client. Since Devel::ebug::Backend listens to "localhost" socket, you will need to relay I/O using tool like socat for true remote debugging. Internally, thanks for it being free software, it is almost a complete ripoff of Devel::ebug source. =head1 SEE ALSO L, L, L =head1 AUTHOR Taisuke Yamada, =cut package Devel::ebug; use Devel::ebug; use IO::Socket::INET; use strict; use warnings; our $VERSION = $Devel::ebug::VERSION; our $ARG = {}; *load = *attach; sub attach { my $self = shift; my $program = $self->program; # just to see if my "load" is in control instead of Devel::ebug::load print STDERR "Attaching to $program...\n"; # import all the plugins into our namespace do { eval "use $_ " } for $self->plugins; # try and connect to the server my $socket; foreach ( 1 .. 10 ) { $socket = IO::Socket::INET->new( PeerAddr => "localhost", PeerPort => $ARG->{port}, Proto => 'tcp', Reuse => 1, ReuserAddr => 1, ); last if $socket; sleep 1; } die "Could not connect: $!" unless $socket; $self->socket($socket); my $response = $self->talk( { command => "ping", version => $VERSION, secret => $ARG->{key}, } ); my $version = $response->{version}; die "Client version $version != our version $VERSION" unless $version eq $VERSION; $self->basic; # get basic information for the first line } package main; use Devel::ebug::Console; use Getopt::Long; use strict; use warnings; GetOptions( my $OPT = {}, 'help', 'port=i', 'key=s' ) || help(); help() if $OPT->{help}; $Devel::ebug::ARG = $OPT; my $console = Devel::ebug::Console->new(); $console->run(); exit(0); sub help { print STDERR < -port -- debuggee args... EOF exit(1); }