summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MANIFEST1
-rw-r--r--lib/perl5db.pl12
-rw-r--r--lib/perl5db.t51
-rw-r--r--lib/perl5db/t/rt-121509-restart-after-chdir33
4 files changed, 96 insertions, 1 deletions
diff --git a/MANIFEST b/MANIFEST
index 226da01c87..dcf792a900 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -4107,6 +4107,7 @@ lib/perl5db/t/lvalue-bug Tests for the Perl debugger
lib/perl5db/t/MyModule.pm Tests for the Perl debugger
lib/perl5db/t/proxy-constants Tests for the Perl debugger
lib/perl5db/t/rt-104168 Tests for the Perl debugger
+lib/perl5db/t/rt-121509-restart-after-chdir Tests for the Perl debugger
lib/perl5db/t/rt-61222 Tests for the Perl debugger
lib/perl5db/t/rt-66110 Tests for the Perl debugger
lib/perl5db/t/source-cmd-test-no-q.perldb Tests for the Perl debugger
diff --git a/lib/perl5db.pl b/lib/perl5db.pl
index 8bc015062a..e3f63b3523 100644
--- a/lib/perl5db.pl
+++ b/lib/perl5db.pl
@@ -512,12 +512,17 @@ package DB;
use strict;
+use Cwd ();
+
+my $_initial_cwd;
+
BEGIN {eval 'use IO::Handle'}; # Needed for flush only? breaks under miniperl
BEGIN {
require feature;
$^V =~ /^v(\d+\.\d+)/;
feature->import(":$1");
+ $_initial_cwd = Cwd::getcwd();
}
# Debugger for Perl 5.00x; perl5db.pl patch level:
@@ -2260,6 +2265,13 @@ sub _DB__handle_restart_and_rerun_commands {
# R - restart execution.
# rerun - controlled restart execution.
if ($cmd_cmd eq 'rerun' or $cmd_params eq '') {
+
+ # Change directory to the initial current working directory on
+ # the script startup, so if the debugged program changed the
+ # directory, then we will still be able to find the path to the
+ # the program. (perl 5 RT #121509 ).
+ chdir ($_initial_cwd);
+
my @args = ($cmd_cmd eq 'R' ? restart() : rerun($cmd_params));
# Close all non-system fds for a clean restart. A more
diff --git a/lib/perl5db.t b/lib/perl5db.t
index 3af7f64e6e..bd5615a673 100644
--- a/lib/perl5db.t
+++ b/lib/perl5db.t
@@ -29,7 +29,7 @@ BEGIN {
$ENV{PERL_RL} = 'Perl'; # Suppress system Term::ReadLine::Gnu
}
-plan(119);
+plan(120);
my $rc_filename = '.perldb';
@@ -2697,6 +2697,55 @@ DebugWrap->new({
);
}
+# perl 5 RT #121509 regression bug.
+# “perl debugger doesn't save starting dir to restart from”
+# Thanks to Linda Walsh for reporting it.
+{
+ use File::Temp qw/tempdir/;
+
+ my $temp_dir = tempdir( CLEANUP => 1 );
+
+ local $ENV{__PERLDB_TEMP_DIR} = $temp_dir;
+ my $wrapper = DebugWrap->new(
+ {
+ cmds =>
+ [
+ # This is to avoid getting the "Debugger program terminated"
+ # junk that interferes with the normal output.
+ 'b _after_chdir',
+ 'c',
+ 'R',
+ 'b _finale',
+ 'c',
+ 'n',
+ 'n',
+ 'n',
+ 'n',
+ 'n',
+ 'n',
+ 'n',
+ 'n',
+ 'n',
+ 'n',
+ 'n',
+ 'n',
+ 'q',
+ ],
+ prog => '../lib/perl5db/t/rt-121509-restart-after-chdir',
+ }
+ );
+
+ $wrapper->output_like(
+ qr/
+In\ _finale\ No\ 1
+ .*?
+In\ _finale\ No\ 2
+ .*?
+In\ _finale\ No\ 3
+ /msx,
+ "Test that the debugger chdirs to the initial directory after a restart.",
+ );
+}
# Test the perldoc command
# We don't actually run the program, but we need to provide one to the wrapper.
SKIP:
diff --git a/lib/perl5db/t/rt-121509-restart-after-chdir b/lib/perl5db/t/rt-121509-restart-after-chdir
new file mode 100644
index 0000000000..f8250d768a
--- /dev/null
+++ b/lib/perl5db/t/rt-121509-restart-after-chdir
@@ -0,0 +1,33 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use IO::Handle;
+
+STDOUT->autoflush(1);
+
+my $tmpdir = $ENV{__PERLDB_TEMP_DIR};
+
+sub _do_chdir
+{
+ chdir($tmpdir);
+}
+
+sub _after_chdir
+{
+ print "_after_chdir\n";
+}
+
+sub _finale
+{
+ my $i = 1;
+ while (1)
+ {
+ print "In _finale No " . ($i++) . "\n";
+ }
+}
+
+_do_chdir();
+_after_chdir();
+_finale();