Das ist ein bisschen Fummelei, weil der Perl-Debugger seine eigenen Datei-Handles verwendet. Die Ausgabe des Debuggers umzuleiten ist noch vergleichsweise einfach, aber mit der Eingabe ist das schwierig.
Man kann sich ein bisschen daran orientieren, wie die IDEs das mit dem eingebetten Debugging machen: Der Debugger kann ja auch über Sockets gesteuert werden. Dazu brauchst Du zwei Terminals: In einem läuft die Debugger-Konsole, im anderen das Programm.
Ein minimalistisches Programm für die Debugger-Konsole sähe so aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use 5.020;
use strict;
use warnings;
use IO::Socket;
my $buffer = "";
my $db_prompt_regex = qr/DB<\d+> $/;
my $db_interface = IO::Socket::INET->new(
Listen => 1,
Proto => 'tcp',
ReusePort => 1,
LocalPort => 5555)
or die "Socket-Problem: $@";
$db_interface->autoflush;
say "Beginne die Session mit: PERLDB_OPTS=RemotePort=localhost:5555 perl -d <programm>";
my $client = $db_interface->accept();
COMMAND_LOOP:
while (1) {
do {
$client->recv($buffer,1024);
print $buffer;
} while ($buffer !~ /$db_prompt_regex/);
my $command = <STDIN>;
$client->print($command);
if ($command =~ /\s*q\s*\n/) {
last COMMAND_LOOP;
}
}
Das startest Du zuerst, und dann im anderen Terminal Dein Curses::UI-Programm wie angegeben mit Angabe von
PERLDB_OPTS=RemotePort=localhost:5555.
Du solltest nun im zweiten Terminal Dein Programm, das im ersten läuft, debuggen können (ich habe es getestet, aber nicht mit Curses::UI).
Mit
q in der Debugger-Konsole beendest Du sowohl Dein Programm als auch die Konsole.
Was dabei draufgeht (wie es so schön heißt: "Bleibt als Übungsaufgabe für den Leser") ist die Unterstützung der Kommando-Historie.