3 # Debugger for Perl 5.00x; perl5db.pl patch level:
6 $header = "perl5db.pl version $VERSION";
9 # This file is automatically included if you do perl -d.
10 # It's probably not useful to include this yourself.
12 # Perl supplies the values for %sub. It effectively inserts
13 # a &DB'DB(); in front of every place that can have a
14 # breakpoint. Instead of a subroutine call it calls &DB::sub with
15 # $DB::sub being the called subroutine. It also inserts a BEGIN
16 # {require 'perl5db.pl'} before the first line.
18 # After each `require'd file is compiled, but before it is executed, a
19 # call to DB::postponed($main::{'_<'.$filename}) is emulated. Here the
20 # $filename is the expanded name of the `require'd file (as found as
23 # Additional services from Perl interpreter:
25 # if caller() is called from the package DB, it provides some
28 # The array @{$main::{'_<'.$filename}} is the line-by-line contents of
31 # The hash %{'_<'.$filename} contains breakpoints and action (it is
32 # keyed by line number), and individual entries are settable (as
33 # opposed to the whole hash). Only true/false is important to the
34 # interpreter, though the values used by perl5db.pl have the form
35 # "$break_condition\0$action". Values are magical in numeric context.
37 # The scalar ${'_<'.$filename} contains $filename.
39 # Note that no subroutine call is possible until &DB::sub is defined
40 # (for subroutines defined outside of the package DB). In fact the same is
41 # true if $deep is not defined.
46 # At start reads $rcfile that may set important options. This file
47 # may define a subroutine &afterinit that will be executed after the
48 # debugger is initialized.
50 # After $rcfile is read reads environment variable PERLDB_OPTS and parses
51 # it as a rest of `O ...' line in debugger prompt.
53 # The options that can be specified only at startup:
54 # [To set in $rcfile, call &parse_options("optionName=new_value").]
56 # TTY - the TTY to use for debugging i/o.
58 # noTTY - if set, goes in NonStop mode. On interrupt if TTY is not set
59 # uses the value of noTTY or "/tmp/perldbtty$$" to find TTY using
60 # Term::Rendezvous. Current variant is to have the name of TTY in this
63 # ReadLine - If false, dummy ReadLine is used, so you can debug
64 # ReadLine applications.
66 # NonStop - if true, no i/o is performed until interrupt.
68 # LineInfo - file or pipe to print line number info to. If it is a
69 # pipe, a short "emacs like" message is used.
71 # RemotePort - host:port to connect to on remote host for remote debugging.
73 # Example $rcfile: (delete leading hashes!)
75 # &parse_options("NonStop=1 LineInfo=db.out");
76 # sub afterinit { $trace = 1; }
78 # The script will run without human intervention, putting trace
79 # information into db.out. (If you interrupt it, you would better
80 # reset LineInfo to something "interactive"!)
82 ##################################################################
84 # Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich)
85 # Latest version available: ftp://ftp.math.ohio-state.edu/pub/users/ilya/perl
87 # modified Perl debugger, to be run from Emacs in perldb-mode
88 # Ray Lischner (uunet!mntgfx!lisch) as of 5 Nov 1990
89 # Johan Vromans -- upgrade to 4.0 pl 10
90 # Ilya Zakharevich -- patches after 5.001 (and some before ;-)
94 # A lot of things changed after 0.94. First of all, core now informs
95 # debugger about entry into XSUBs, overloaded operators, tied operations,
96 # BEGIN and END. Handy with `O f=2'.
98 # This can make debugger a little bit too verbose, please be patient
99 # and report your problems promptly.
101 # Now the option frame has 3 values: 0,1,2.
103 # Note that if DESTROY returns a reference to the object (or object),
104 # the deletion of data may be postponed until the next function call,
105 # due to the need to examine the return value.
107 # Changes: 0.95: `v' command shows versions.
108 # Changes: 0.96: `v' command shows version of readline.
109 # primitive completion works (dynamic variables, subs for `b' and `l',
110 # options). Can `p %var'
111 # Better help (`h <' now works). New commands <<, >>, {, {{.
112 # {dump|print}_trace() coded (to be able to do it from <<cmd).
113 # `c sub' documented.
114 # At last enough magic combined to stop after the end of debuggee.
115 # !! should work now (thanks to Emacs bracket matching an extra
116 # `]' in a regexp is caught).
117 # `L', `D' and `A' span files now (as documented).
118 # Breakpoints in `require'd code are possible (used in `R').
119 # Some additional words on internal work of debugger.
120 # `b load filename' implemented.
121 # `b postpone subr' implemented.
122 # now only `q' exits debugger (overwriteable on $inhibit_exit).
123 # When restarting debugger breakpoints/actions persist.
124 # Buglet: When restarting debugger only one breakpoint/action per
125 # autoloaded function persists.
126 # Changes: 0.97: NonStop will not stop in at_exit().
127 # Option AutoTrace implemented.
128 # Trace printed differently if frames are printed too.
129 # new `inhibitExit' option.
130 # printing of a very long statement interruptible.
131 # Changes: 0.98: New command `m' for printing possible methods
132 # 'l -' is a synonim for `-'.
133 # Cosmetic bugs in printing stack trace.
134 # `frame' & 8 to print "expanded args" in stack trace.
135 # Can list/break in imported subs.
136 # new `maxTraceLen' option.
137 # frame & 4 and frame & 8 granted.
139 # nonstoppable lines do not have `:' near the line number.
140 # `b compile subname' implemented.
141 # Will not use $` any more.
142 # `-' behaves sane now.
143 # Changes: 0.99: Completion for `f', `m'.
144 # `m' will remove duplicate names instead of duplicate functions.
145 # `b load' strips trailing whitespace.
146 # completion ignores leading `|'; takes into account current package
147 # when completing a subroutine name (same for `l').
148 # Changes: 1.07: Many fixed by tchrist 13-March-2000
150 # + Added bare mimimal security checks on perldb rc files, plus
151 # comments on what else is needed.
152 # + Fixed the ornaments that made "|h" completely unusable.
153 # They are not used in print_help if they will hurt. Strip pod
154 # if we're paging to less.
155 # + Fixed mis-formatting of help messages caused by ornaments
156 # to restore Larry's original formatting.
157 # + Fixed many other formatting errors. The code is still suboptimal,
158 # and needs a lot of work at restructuing. It's also misindented
160 # + Fixed bug where trying to look at an option like your pager
162 # + Fixed some $? processing. Note: if you use csh or tcsh, you will
163 # lose. You should consider shell escapes not using their shell,
164 # or else not caring about detailed status. This should really be
165 # unified into one place, too.
166 # + Fixed bug where invisible trailing whitespace on commands hoses you,
167 # tricking Perl into thinking you wern't calling a debugger command!
168 # + Fixed bug where leading whitespace on commands hoses you. (One
169 # suggests a leading semicolon or any other irrelevant non-whitespace
170 # to indicate literal Perl code.)
171 # + Fixed bugs that ate warnings due to wrong selected handle.
172 # + Fixed a precedence bug on signal stuff.
173 # + Fixed some unseemly wording.
174 # + Fixed bug in help command trying to call perl method code.
175 # + Fixed to call dumpvar from exception handler. SIGPIPE killed us.
177 # + Added some comments. This code is still nasty spaghetti.
178 # + Added message if you clear your pre/post command stacks which was
179 # very easy to do if you just typed a bare >, <, or {. (A command
180 # without an argument should *never* be a destructive action; this
181 # API is fundamentally screwed up; likewise option setting, which
182 # is equally buggered.)
183 # + Added command stack dump on argument of "?" for >, <, or {.
184 # + Added a semi-built-in doc viewer command that calls man with the
185 # proper %Config::Config path (and thus gets caching, man -k, etc),
186 # or else perldoc on obstreperous platforms.
187 # + Added to and rearranged the help information.
188 # + Detected apparent misuse of { ... } to declare a block; this used
189 # to work but now is a command, and mysteriously gave no complaint.
191 ####################################################################
193 # Needed for the statement after exec():
195 BEGIN { $ini_warn = $^W; $^W = 0 } # Switch compilation warnings off until another BEGIN.
196 local($^W) = 0; # Switch run-time warnings off during init.
199 $dumpvar::arrayDepth,
200 $dumpvar::dumpDBFiles,
201 $dumpvar::dumpPackages,
202 $dumpvar::quoteHighBit,
203 $dumpvar::printUndef,
212 # Command-line + PERLLIB:
215 # $prevwarn = $prevdie = $prevbus = $prevsegv = ''; # Does not help?!
217 $trace = $signal = $single = 0; # Uninitialized warning suppression
218 # (local $^W cannot help - other packages!).
219 $inhibit_exit = $option{PrintRet} = 1;
221 @options = qw(hashDepth arrayDepth DumpDBFiles DumpPackages DumpReused
222 compactDump veryCompact quote HighBit undefPrint
223 globPrint PrintRet UsageOnly frame AutoTrace
224 TTY noTTY ReadLine NonStop LineInfo maxTraceLen
225 recallCommand ShellBang pager tkRunning ornaments
226 signalLevel warnLevel dieLevel inhibit_exit
227 ImmediateStop bareStringify CreateTTY
231 hashDepth => \$dumpvar::hashDepth,
232 arrayDepth => \$dumpvar::arrayDepth,
233 DumpDBFiles => \$dumpvar::dumpDBFiles,
234 DumpPackages => \$dumpvar::dumpPackages,
235 DumpReused => \$dumpvar::dumpReused,
236 HighBit => \$dumpvar::quoteHighBit,
237 undefPrint => \$dumpvar::printUndef,
238 globPrint => \$dumpvar::globPrint,
239 UsageOnly => \$dumpvar::usageOnly,
240 CreateTTY => \$CreateTTY,
241 bareStringify => \$dumpvar::bareStringify,
243 AutoTrace => \$trace,
244 inhibit_exit => \$inhibit_exit,
245 maxTraceLen => \$maxtrace,
246 ImmediateStop => \$ImmediateStop,
247 RemotePort => \$remoteport,
251 compactDump => \&dumpvar::compactDump,
252 veryCompact => \&dumpvar::veryCompact,
253 quote => \&dumpvar::quote,
256 ReadLine => \&ReadLine,
257 NonStop => \&NonStop,
258 LineInfo => \&LineInfo,
259 recallCommand => \&recallCommand,
260 ShellBang => \&shellBang,
262 signalLevel => \&signalLevel,
263 warnLevel => \&warnLevel,
264 dieLevel => \&dieLevel,
265 tkRunning => \&tkRunning,
266 ornaments => \&ornaments,
267 RemotePort => \&RemotePort,
271 compactDump => 'dumpvar.pl',
272 veryCompact => 'dumpvar.pl',
273 quote => 'dumpvar.pl',
276 # These guys may be defined in $ENV{PERL5DB} :
277 $rl = 1 unless defined $rl;
278 $warnLevel = 0 unless defined $warnLevel;
279 $dieLevel = 0 unless defined $dieLevel;
280 $signalLevel = 1 unless defined $signalLevel;
281 $pre = [] unless defined $pre;
282 $post = [] unless defined $post;
283 $pretype = [] unless defined $pretype;
284 $CreateTTY = 3 unless defined $CreateTTY;
286 warnLevel($warnLevel);
288 signalLevel($signalLevel);
291 (defined($ENV{PAGER})
295 : 'more'))) unless defined $pager;
297 &recallCommand("!") unless defined $prc;
298 &shellBang("!") unless defined $psh;
299 $maxtrace = 400 unless defined $maxtrace;
300 $ini_pids = $ENV{PERLDB_PIDS};
301 if (defined $ENV{PERLDB_PIDS}) {
302 $pids = "[$ENV{PERLDB_PIDS}]";
303 $ENV{PERLDB_PIDS} .= "->$$";
306 $ENV{PERLDB_PIDS} = "$$";
311 *emacs = $slave_editor; # May be used in afterinit()...
313 if (-e "/dev/tty") { # this is the wrong metric!
316 $rcfile="perldb.ini";
319 # This isn't really safe, because there's a race
320 # between checking and opening. The solution is to
321 # open and fstat the handle, but then you have to read and
322 # eval the contents. But then the silly thing gets
323 # your lexical scope, which is unfortunately at best.
327 # Just exactly what part of the word "CORE::" don't you understand?
328 local $SIG{__WARN__};
331 unless (is_safe_file($file)) {
332 CORE::warn <<EO_GRIPE;
333 perldb: Must not source insecure rcfile $file.
334 You or the superuser must be the owner, and it must not
335 be writable by anyone but its owner.
341 CORE::warn("perldb: couldn't parse $file: $@") if $@;
345 # Verifies that owner is either real user or superuser and that no
346 # one but owner may write to it. This function is of limited use
347 # when called on a path instead of upon a handle, because there are
348 # no guarantees that filename (by dirent) whose file (by ino) is
349 # eventually accessed is the same as the one tested.
350 # Assumes that the file's existence is not in doubt.
353 stat($path) || return; # mysteriously vaporized
354 my($dev,$ino,$mode,$nlink,$uid,$gid) = stat(_);
356 return 0 if $uid != 0 && $uid != $<;
357 return 0 if $mode & 022;
362 safe_do("./$rcfile");
364 elsif (defined $ENV{HOME} && -f "$ENV{HOME}/$rcfile") {
365 safe_do("$ENV{HOME}/$rcfile");
367 elsif (defined $ENV{LOGDIR} && -f "$ENV{LOGDIR}/$rcfile") {
368 safe_do("$ENV{LOGDIR}/$rcfile");
371 if (defined $ENV{PERLDB_OPTS}) {
372 parse_options($ENV{PERLDB_OPTS});
375 if ( not defined &get_fork_TTY and defined $ENV{TERM} and $ENV{TERM} eq 'xterm'
376 and defined $ENV{WINDOWID} and defined $ENV{DISPLAY} ) { # _inside_ XTERM?
377 *get_fork_TTY = \&xterm_get_fork_TTY;
378 } elsif ($^O eq 'os2') {
379 *get_fork_TTY = \&os2_get_fork_TTY;
382 # Here begin the unreadable code. It needs fixing.
384 if (exists $ENV{PERLDB_RESTART}) {
385 delete $ENV{PERLDB_RESTART};
387 @hist = get_list('PERLDB_HIST');
388 %break_on_load = get_list("PERLDB_ON_LOAD");
389 %postponed = get_list("PERLDB_POSTPONE");
390 my @had_breakpoints= get_list("PERLDB_VISITED");
391 for (0 .. $#had_breakpoints) {
392 my %pf = get_list("PERLDB_FILE_$_");
393 $postponed_file{$had_breakpoints[$_]} = \%pf if %pf;
395 my %opt = get_list("PERLDB_OPT");
397 while (($opt,$val) = each %opt) {
398 $val =~ s/[\\\']/\\$1/g;
399 parse_options("$opt'$val'");
401 @INC = get_list("PERLDB_INC");
403 $pretype = [get_list("PERLDB_PRETYPE")];
404 $pre = [get_list("PERLDB_PRE")];
405 $post = [get_list("PERLDB_POST")];
406 @typeahead = get_list("PERLDB_TYPEAHEAD", @typeahead);
412 # Is Perl being run from a slave editor or graphical debugger?
413 $slave_editor = ((defined $main::ARGV[0]) and ($main::ARGV[0] eq '-emacs'));
414 $rl = 0, shift(@main::ARGV) if $slave_editor;
416 #require Term::ReadLine;
418 if ($^O eq 'cygwin') {
419 # /dev/tty is binary. use stdin for textmode
421 } elsif (-e "/dev/tty") {
422 $console = "/dev/tty";
423 } elsif ($^O eq 'dos' or -e "con" or $^O eq 'MSWin32') {
425 } elsif ($^O eq 'MacOS') {
426 if ($MacPerl::Version !~ /MPW/) {
427 $console = "Dev:Console:Perl Debug"; # Separate window for application
429 $console = "Dev:Console";
432 $console = "sys\$command";
435 if (($^O eq 'MSWin32') and ($slave_editor or defined $ENV{EMACS})) {
440 if (defined $ENV{OS2_SHELL} and ($slave_editor or $ENV{WINDOWID})) { # In OS/2
448 $console = $tty if defined $tty;
450 if (defined $remoteport) {
452 $OUT = new IO::Socket::INET( Timeout => '10',
453 PeerAddr => $remoteport,
456 if (!$OUT) { die "Unable to connect to remote host: $remoteport\n"; }
458 } elsif ($CreateTTY & 4) {
461 if (defined $console) {
462 my ($i, $o) = split $console, /,/;
463 $o = $i unless defined $o;
464 open(IN,"+<$i") || open(IN,"<$i") || open(IN,"<&STDIN");
465 open(OUT,"+>$o") || open(OUT,">$o") || open(OUT,">&STDERR")
466 || open(OUT,">&STDOUT"); # so we don't dongle stdout
469 open(OUT,">&STDERR") || open(OUT,">&STDOUT"); # so we don't dongle stdout
470 $console = 'STDIN/OUT';
472 # so open("|more") can read from STDOUT and so we don't dingle stdin
478 $| = 1; # for DB::OUT
481 $LINEINFO = $OUT unless defined $LINEINFO;
482 $lineinfo = $console unless defined $lineinfo;
484 $| = 1; # for real STDOUT
486 $header =~ s/.Header: ([^,]+),v(\s+\S+\s+\S+).*$/$1$2/;
487 unless ($runnonstop) {
488 if ($term_pid eq '-1') {
489 print $OUT "\nDaughter DB session started...\n";
491 print $OUT "\nLoading DB routines from $header\n";
492 print $OUT ("Editor support ",
493 $slave_editor ? "enabled" : "available",
495 print $OUT "\nEnter h or `h h' for help, or `$doccmd perldebug' for more help.\n\n";
503 s/(.*)/'$1'/ unless /^-?[\d.]+$/;
506 if (defined &afterinit) { # May be defined in $rcfile
512 ############################################################ Subroutines
515 # _After_ the perl program is compiled, $single is set to 1:
516 if ($single and not $second_time++) {
517 if ($runnonstop) { # Disable until signal
518 for ($i=0; $i <= $stack_depth; ) {
522 # return; # Would not print trace!
523 } elsif ($ImmediateStop) {
528 $runnonstop = 0 if $single or $signal; # Disable it if interactive.
530 ($package, $filename, $line) = caller;
531 $filename_ini = $filename;
532 $usercontext = '($@, $!, $^E, $,, $/, $\, $^W) = @saved;' .
533 "package $package;"; # this won't let them modify, alas
534 local(*dbline) = $main::{'_<' . $filename};
536 if (($stop,$action) = split(/\0/,$dbline{$line})) {
540 $evalarg = "\$DB::signal |= 1 if do {$stop}"; &eval;
541 $dbline{$line} =~ s/;9($|\0)/$1/;
544 my $was_signal = $signal;
546 for (my $n = 0; $n <= $#to_watch; $n++) {
547 $evalarg = $to_watch[$n];
548 local $onetimeDump; # Do not output results
549 my ($val) = &eval; # Fix context (&eval is doing array)?
550 $val = ( (defined $val) ? "'$val'" : 'undef' );
551 if ($val ne $old_watch[$n]) {
554 Watchpoint $n:\t$to_watch[$n] changed:
555 old value:\t$old_watch[$n]
558 $old_watch[$n] = $val;
562 if ($trace & 4) { # User-installed watch
563 return if watchfunction($package, $filename, $line)
564 and not $single and not $was_signal and not ($trace & ~4);
566 $was_signal = $signal;
568 if ($single || ($trace & 1) || $was_signal) {
570 $position = "\032\032$filename:$line:0\n";
571 print_lineinfo($position);
572 } elsif ($package eq 'DB::fake') {
575 Debugged program terminated. Use B<q> to quit or B<R> to restart,
576 use B<O> I<inhibit_exit> to avoid stopping after program termination,
577 B<h q>, B<h R> or B<h O> to get additional info.
580 $usercontext = '($@, $!, $^E, $,, $/, $\, $^W) = @saved;' .
581 "package $package;"; # this won't let them modify, alas
584 $prefix = $sub =~ /::/ ? "" : "${'package'}::";
585 $prefix .= "$sub($filename:";
586 $after = ($dbline[$line] =~ /\n$/ ? '' : "\n");
587 if (length($prefix) > 30) {
588 $position = "$prefix$line):\n$line:\t$dbline[$line]$after";
593 $position = "$prefix$line$infix$dbline[$line]$after";
596 print_lineinfo(' ' x $stack_depth, "$line:\t$dbline[$line]$after");
598 print_lineinfo($position);
600 for ($i = $line + 1; $i <= $max && $dbline[$i] == 0; ++$i) { #{ vi
601 last if $dbline[$i] =~ /^\s*[\;\}\#\n]/;
603 $after = ($dbline[$i] =~ /\n$/ ? '' : "\n");
604 $incr_pos = "$prefix$i$infix$dbline[$i]$after";
605 $position .= $incr_pos;
607 print_lineinfo(' ' x $stack_depth, "$i:\t$dbline[$i]$after");
609 print_lineinfo($incr_pos);
614 $evalarg = $action, &eval if $action;
615 if ($single || $was_signal) {
616 local $level = $level + 1;
617 foreach $evalarg (@$pre) {
620 print $OUT $stack_depth . " levels deep in subroutine calls!\n"
623 $incr = -1; # for backward motion.
624 @typeahead = (@$pretype, @typeahead);
626 while (($term || &setterm),
627 ($term_pid == $$ or resetterm(1)),
628 defined ($cmd=&readline("$pidprompt DB" . ('<' x $level) .
629 ($#hist+1) . ('>' x $level) .
634 $cmd =~ s/\\$/\n/ && do {
635 $cmd .= &readline(" cont: ");
638 $cmd =~ /^$/ && ($cmd = $laststep);
639 push(@hist,$cmd) if length($cmd) > 1;
641 $cmd =~ s/^\s+//s; # trim annoying leading whitespace
642 $cmd =~ s/\s+$//s; # trim annoying trailing whitespace
643 ($i) = split(/\s+/,$cmd);
645 # squelch the sigmangler
647 local $SIG{__WARN__};
648 eval "\$cmd =~ $alias{$i}";
650 print $OUT "Couldn't evaluate `$i' alias: $@";
654 $cmd =~ /^q$/ && ($fall_off_end = 1) && exit $?;
655 $cmd =~ /^h$/ && do {
658 $cmd =~ /^h\s+h$/ && do {
659 print_help($summary);
661 # support long commands; otherwise bogus errors
662 # happen when you ask for h on <CR> for example
663 $cmd =~ /^h\s+(\S.*)$/ && do {
664 my $asked = $1; # for proper errmsg
665 my $qasked = quotemeta($asked); # for searching
666 # XXX: finds CR but not <CR>
667 if ($help =~ /^<?(?:[IB]<)$qasked/m) {
668 while ($help =~ /^(<?(?:[IB]<)$qasked([\s\S]*?)\n)(?!\s)/mg) {
672 print_help("B<$asked> is not a debugger command.\n");
675 $cmd =~ /^t$/ && do {
677 print $OUT "Trace = " .
678 (($trace & 1) ? "on" : "off" ) . "\n";
680 $cmd =~ /^S(\s+(!)?(.+))?$/ && do {
681 $Srev = defined $2; $Spatt = $3; $Snocheck = ! defined $1;
682 foreach $subname (sort(keys %sub)) {
683 if ($Snocheck or $Srev^($subname =~ /$Spatt/)) {
684 print $OUT $subname,"\n";
688 $cmd =~ /^v$/ && do {
689 list_versions(); next CMD};
690 $cmd =~ s/^X\b/V $package/;
691 $cmd =~ /^V$/ && do {
692 $cmd = "V $package"; };
693 $cmd =~ /^V\b\s*(\S+)\s*(.*)/ && do {
694 local ($savout) = select($OUT);
696 @vars = split(' ',$2);
697 do 'dumpvar.pl' unless defined &main::dumpvar;
698 if (defined &main::dumpvar) {
701 # must detect sigpipe failures
702 eval { &main::dumpvar($packname,@vars) };
704 die unless $@ =~ /dumpvar print failed/;
707 print $OUT "dumpvar.pl not available.\n";
711 $cmd =~ s/^x\b/ / && do { # So that will be evaled
712 $onetimeDump = 'dump'; };
713 $cmd =~ s/^m\s+([\w:]+)\s*$/ / && do {
714 methods($1); next CMD};
715 $cmd =~ s/^m\b/ / && do { # So this will be evaled
716 $onetimeDump = 'methods'; };
717 $cmd =~ /^f\b\s*(.*)/ && do {
721 print $OUT "The old f command is now the r command.\n";
722 print $OUT "The new f command switches filenames.\n";
725 if (!defined $main::{'_<' . $file}) {
726 if (($try) = grep(m#^_<.*$file#, keys %main::)) {{
727 $try = substr($try,2);
728 print $OUT "Choosing $try matching `$file':\n";
732 if (!defined $main::{'_<' . $file}) {
733 print $OUT "No file matching `$file' is loaded.\n";
735 } elsif ($file ne $filename) {
736 *dbline = $main::{'_<' . $file};
742 print $OUT "Already in $file.\n";
746 $cmd =~ s/^l\s+-\s*$/-/;
747 $cmd =~ /^([lb])\b\s*(\$.*)/s && do {
750 print($OUT "Error: $@\n"), next CMD if $@;
752 print($OUT "Interpreted as: $1 $s\n");
755 $cmd =~ /^l\b\s*([\':A-Za-z_][\':\w]*(\[.*\])?)/s && do {
756 my $s = $subname = $1;
757 $subname =~ s/\'/::/;
758 $subname = $package."::".$subname
759 unless $subname =~ /::/;
760 $subname = "CORE::GLOBAL::$s"
761 if not defined &$subname and $s !~ /::/
762 and defined &{"CORE::GLOBAL::$s"};
763 $subname = "main".$subname if substr($subname,0,2) eq "::";
764 @pieces = split(/:/,find_sub($subname) || $sub{$subname});
765 $subrange = pop @pieces;
766 $file = join(':', @pieces);
767 if ($file ne $filename) {
768 print $OUT "Switching to file '$file'.\n"
769 unless $slave_editor;
770 *dbline = $main::{'_<' . $file};
775 if (eval($subrange) < -$window) {
776 $subrange =~ s/-.*/+/;
778 $cmd = "l $subrange";
780 print $OUT "Subroutine $subname not found.\n";
783 $cmd =~ /^\.$/ && do {
784 $incr = -1; # for backward motion.
786 $filename = $filename_ini;
787 *dbline = $main::{'_<' . $filename};
789 print_lineinfo($position);
791 $cmd =~ /^w\b\s*(\d*)$/ && do {
795 #print $OUT 'l ' . $start . '-' . ($start + $incr);
796 $cmd = 'l ' . $start . '-' . ($start + $incr); };
797 $cmd =~ /^-$/ && do {
798 $start -= $incr + $window + 1;
799 $start = 1 if $start <= 0;
801 $cmd = 'l ' . ($start) . '+'; };
802 $cmd =~ /^l$/ && do {
804 $cmd = 'l ' . $start . '-' . ($start + $incr); };
805 $cmd =~ /^l\b\s*(\d*)\+(\d*)$/ && do {
808 $incr = $window - 1 unless $incr;
809 $cmd = 'l ' . $start . '-' . ($start + $incr); };
810 $cmd =~ /^l\b\s*((-?[\d\$\.]+)([-,]([\d\$\.]+))?)?/ && do {
811 $end = (!defined $2) ? $max : ($4 ? $4 : $2);
812 $end = $max if $end > $max;
814 $i = $line if $i eq '.';
818 print $OUT "\032\032$filename:$i:0\n";
821 for (; $i <= $end; $i++) {
822 ($stop,$action) = split(/\0/, $dbline{$i});
824 and $filename eq $filename_ini)
826 : ($dbline[$i]+0 ? ':' : ' ') ;
827 $arrow .= 'b' if $stop;
828 $arrow .= 'a' if $action;
829 print $OUT "$i$arrow\t", $dbline[$i];
830 $i++, last if $signal;
832 print $OUT "\n" unless $dbline[$i-1] =~ /\n$/;
834 $start = $i; # remember in case they want more
835 $start = $max if $start > $max;
837 $cmd =~ /^D$/ && do {
838 print $OUT "Deleting all breakpoints...\n";
840 for $file (keys %had_breakpoints) {
841 local *dbline = $main::{'_<' . $file};
845 for ($i = 1; $i <= $max ; $i++) {
846 if (defined $dbline{$i}) {
847 $dbline{$i} =~ s/^[^\0]+//;
848 if ($dbline{$i} =~ s/^\0?$//) {
854 if (not $had_breakpoints{$file} &= ~1) {
855 delete $had_breakpoints{$file};
859 undef %postponed_file;
860 undef %break_on_load;
862 $cmd =~ /^L$/ && do {
864 for $file (keys %had_breakpoints) {
865 local *dbline = $main::{'_<' . $file};
869 for ($i = 1; $i <= $max; $i++) {
870 if (defined $dbline{$i}) {
871 print $OUT "$file:\n" unless $was++;
872 print $OUT " $i:\t", $dbline[$i];
873 ($stop,$action) = split(/\0/, $dbline{$i});
874 print $OUT " break if (", $stop, ")\n"
876 print $OUT " action: ", $action, "\n"
883 print $OUT "Postponed breakpoints in subroutines:\n";
885 for $subname (keys %postponed) {
886 print $OUT " $subname\t$postponed{$subname}\n";
890 my @have = map { # Combined keys
891 keys %{$postponed_file{$_}}
892 } keys %postponed_file;
894 print $OUT "Postponed breakpoints in files:\n";
896 for $file (keys %postponed_file) {
897 my $db = $postponed_file{$file};
898 print $OUT " $file:\n";
899 for $line (sort {$a <=> $b} keys %$db) {
900 print $OUT " $line:\n";
901 my ($stop,$action) = split(/\0/, $$db{$line});
902 print $OUT " break if (", $stop, ")\n"
904 print $OUT " action: ", $action, "\n"
911 if (%break_on_load) {
912 print $OUT "Breakpoints on load:\n";
914 for $file (keys %break_on_load) {
915 print $OUT " $file\n";
920 print $OUT "Watch-expressions:\n";
922 for $expr (@to_watch) {
923 print $OUT " $expr\n";
928 $cmd =~ /^b\b\s*load\b\s*(.*)/ && do {
929 my $file = $1; $file =~ s/\s+$//;
932 $cmd =~ /^b\b\s*(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ && do {
933 my $cond = length $3 ? $3 : '1';
934 my ($subname, $break) = ($2, $1 eq 'postpone');
935 $subname =~ s/\'/::/g;
936 $subname = "${'package'}::" . $subname
937 unless $subname =~ /::/;
938 $subname = "main".$subname if substr($subname,0,2) eq "::";
939 $postponed{$subname} = $break
940 ? "break +0 if $cond" : "compile";
942 $cmd =~ /^b\b\s*([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ && do {
944 $cond = length $2 ? $2 : '1';
945 cmd_b_sub($subname, $cond);
947 $cmd =~ /^b\b\s*(\d*)\s*(.*)/ && do {
949 $cond = length $2 ? $2 : '1';
950 cmd_b_line($i, $cond);
952 $cmd =~ /^d\b\s*(\d*)/ && do {
955 $cmd =~ /^A$/ && do {
956 print $OUT "Deleting all actions...\n";
958 for $file (keys %had_breakpoints) {
959 local *dbline = $main::{'_<' . $file};
963 for ($i = 1; $i <= $max ; $i++) {
964 if (defined $dbline{$i}) {
965 $dbline{$i} =~ s/\0[^\0]*//;
966 delete $dbline{$i} if $dbline{$i} eq '';
970 unless ($had_breakpoints{$file} &= ~2) {
971 delete $had_breakpoints{$file};
975 $cmd =~ /^O\s*$/ && do {
980 $cmd =~ /^O\s*(\S.*)/ && do {
983 $cmd =~ /^\<\<\s*(.*)/ && do { # \<\< for CPerl sake: not HERE
984 push @$pre, action($1);
986 $cmd =~ /^>>\s*(.*)/ && do {
987 push @$post, action($1);
989 $cmd =~ /^<\s*(.*)/ && do {
991 print $OUT "All < actions cleared.\n";
997 print $OUT "No pre-prompt Perl actions.\n";
1000 print $OUT "Perl commands run before each prompt:\n";
1001 for my $action ( @$pre ) {
1002 print $OUT "\t< -- $action\n";
1006 $pre = [action($1)];
1008 $cmd =~ /^>\s*(.*)/ && do {
1010 print $OUT "All > actions cleared.\n";
1016 print $OUT "No post-prompt Perl actions.\n";
1019 print $OUT "Perl commands run after each prompt:\n";
1020 for my $action ( @$post ) {
1021 print $OUT "\t> -- $action\n";
1025 $post = [action($1)];
1027 $cmd =~ /^\{\{\s*(.*)/ && do {
1028 if ($cmd =~ /^\{.*\}$/ && unbalanced(substr($cmd,2))) {
1029 print $OUT "{{ is now a debugger command\n",
1030 "use `;{{' if you mean Perl code\n";
1036 $cmd =~ /^\{\s*(.*)/ && do {
1038 print $OUT "All { actions cleared.\n";
1043 unless (@$pretype) {
1044 print $OUT "No pre-prompt debugger actions.\n";
1047 print $OUT "Debugger commands run before each prompt:\n";
1048 for my $action ( @$pretype ) {
1049 print $OUT "\t{ -- $action\n";
1053 if ($cmd =~ /^\{.*\}$/ && unbalanced(substr($cmd,1))) {
1054 print $OUT "{ is now a debugger command\n",
1055 "use `;{' if you mean Perl code\n";
1061 $cmd =~ /^a\b\s*(\d*)\s*(.*)/ && do {
1062 $i = $1 || $line; $j = $2;
1064 if ($dbline[$i] == 0) {
1065 print $OUT "Line $i may not have an action.\n";
1067 $had_breakpoints{$filename} |= 2;
1068 $dbline{$i} =~ s/\0[^\0]*//;
1069 $dbline{$i} .= "\0" . action($j);
1072 $dbline{$i} =~ s/\0[^\0]*//;
1073 delete $dbline{$i} if $dbline{$i} eq '';
1076 $cmd =~ /^n$/ && do {
1077 end_report(), next CMD if $finished and $level <= 1;
1081 $cmd =~ /^s$/ && do {
1082 end_report(), next CMD if $finished and $level <= 1;
1086 $cmd =~ /^c\b\s*([\w:]*)\s*$/ && do {
1087 end_report(), next CMD if $finished and $level <= 1;
1089 # Probably not needed, since we finish an interactive
1090 # sub-session anyway...
1091 # local $filename = $filename;
1092 # local *dbline = *dbline; # XXX Would this work?!
1093 if ($i =~ /\D/) { # subroutine name
1094 $subname = $package."::".$subname
1095 unless $subname =~ /::/;
1096 ($file,$i) = (find_sub($subname) =~ /^(.*):(.*)$/);
1100 *dbline = $main::{'_<' . $filename};
1101 $had_breakpoints{$filename} |= 1;
1103 ++$i while $dbline[$i] == 0 && $i < $max;
1105 print $OUT "Subroutine $subname not found.\n";
1110 if ($dbline[$i] == 0) {
1111 print $OUT "Line $i not breakable.\n";
1114 $dbline{$i} =~ s/($|\0)/;9$1/; # add one-time-only b.p.
1116 for ($i=0; $i <= $stack_depth; ) {
1120 $cmd =~ /^r$/ && do {
1121 end_report(), next CMD if $finished and $level <= 1;
1122 $stack[$stack_depth] |= 1;
1123 $doret = $option{PrintRet} ? $stack_depth - 1 : -2;
1125 $cmd =~ /^R$/ && do {
1126 print $OUT "Warning: some settings and command-line options may be lost!\n";
1127 my (@script, @flags, $cl);
1128 push @flags, '-w' if $ini_warn;
1129 # Put all the old includes at the start to get
1130 # the same debugger.
1132 push @flags, '-I', $_;
1134 # Arrange for setting the old INC:
1135 set_list("PERLDB_INC", @ini_INC);
1137 for (1..$#{'::_<-e'}) { # The first line is PERL5DB
1138 chomp ($cl = ${'::_<-e'}[$_]);
1139 push @script, '-e', $cl;
1144 set_list("PERLDB_HIST",
1145 $term->Features->{getHistory}
1146 ? $term->GetHistory : @hist);
1147 my @had_breakpoints = keys %had_breakpoints;
1148 set_list("PERLDB_VISITED", @had_breakpoints);
1149 set_list("PERLDB_OPT", %option);
1150 set_list("PERLDB_ON_LOAD", %break_on_load);
1152 for (0 .. $#had_breakpoints) {
1153 my $file = $had_breakpoints[$_];
1154 *dbline = $main::{'_<' . $file};
1155 next unless %dbline or $postponed_file{$file};
1156 (push @hard, $file), next
1157 if $file =~ /^\(eval \d+\)$/;
1159 @add = %{$postponed_file{$file}}
1160 if $postponed_file{$file};
1161 set_list("PERLDB_FILE_$_", %dbline, @add);
1163 for (@hard) { # Yes, really-really...
1164 # Find the subroutines in this eval
1165 *dbline = $main::{'_<' . $_};
1166 my ($quoted, $sub, %subs, $line) = quotemeta $_;
1167 for $sub (keys %sub) {
1168 next unless $sub{$sub} =~ /^$quoted:(\d+)-(\d+)$/;
1169 $subs{$sub} = [$1, $2];
1173 "No subroutines in $_, ignoring breakpoints.\n";
1176 LINES: for $line (keys %dbline) {
1177 # One breakpoint per sub only:
1178 my ($offset, $sub, $found);
1179 SUBS: for $sub (keys %subs) {
1180 if ($subs{$sub}->[1] >= $line # Not after the subroutine
1181 and (not defined $offset # Not caught
1182 or $offset < 0 )) { # or badly caught
1184 $offset = $line - $subs{$sub}->[0];
1185 $offset = "+$offset", last SUBS if $offset >= 0;
1188 if (defined $offset) {
1189 $postponed{$found} =
1190 "break $offset if $dbline{$line}";
1192 print $OUT "Breakpoint in $_:$line ignored: after all the subroutines.\n";
1196 set_list("PERLDB_POSTPONE", %postponed);
1197 set_list("PERLDB_PRETYPE", @$pretype);
1198 set_list("PERLDB_PRE", @$pre);
1199 set_list("PERLDB_POST", @$post);
1200 set_list("PERLDB_TYPEAHEAD", @typeahead);
1201 $ENV{PERLDB_RESTART} = 1;
1202 delete $ENV{PERLDB_PIDS}; # Restore ini state
1203 $ENV{PERLDB_PIDS} = $ini_pids if defined $ini_pids;
1204 #print "$^X, '-d', @flags, @script, ($slave_editor ? '-emacs' : ()), @ARGS";
1205 exec $^X, '-d', @flags, @script, ($slave_editor ? '-emacs' : ()), @ARGS;
1206 print $OUT "exec failed: $!\n";
1208 $cmd =~ /^T$/ && do {
1209 print_trace($OUT, 1); # skip DB
1211 $cmd =~ /^W\s*$/ && do {
1213 @to_watch = @old_watch = ();
1215 $cmd =~ /^W\b\s*(.*)/s && do {
1219 $val = (defined $val) ? "'$val'" : 'undef' ;
1220 push @old_watch, $val;
1223 $cmd =~ /^\/(.*)$/ && do {
1225 $inpat =~ s:([^\\])/$:$1:;
1227 # squelch the sigmangler
1228 local $SIG{__DIE__};
1229 local $SIG{__WARN__};
1230 eval '$inpat =~ m'."\a$inpat\a";
1242 $start = 1 if ($start > $max);
1243 last if ($start == $end);
1244 if ($dbline[$start] =~ m' . "\a$pat\a" . 'i) {
1245 if ($slave_editor) {
1246 print $OUT "\032\032$filename:$start:0\n";
1248 print $OUT "$start:\t", $dbline[$start], "\n";
1253 print $OUT "/$pat/: not found\n" if ($start == $end);
1255 $cmd =~ /^\?(.*)$/ && do {
1257 $inpat =~ s:([^\\])\?$:$1:;
1259 # squelch the sigmangler
1260 local $SIG{__DIE__};
1261 local $SIG{__WARN__};
1262 eval '$inpat =~ m'."\a$inpat\a";
1274 $start = $max if ($start <= 0);
1275 last if ($start == $end);
1276 if ($dbline[$start] =~ m' . "\a$pat\a" . 'i) {
1277 if ($slave_editor) {
1278 print $OUT "\032\032$filename:$start:0\n";
1280 print $OUT "$start:\t", $dbline[$start], "\n";
1285 print $OUT "?$pat?: not found\n" if ($start == $end);
1287 $cmd =~ /^$rc+\s*(-)?(\d+)?$/ && do {
1288 pop(@hist) if length($cmd) > 1;
1289 $i = $1 ? ($#hist-($2||1)) : ($2||$#hist);
1291 print $OUT $cmd, "\n";
1293 $cmd =~ /^$sh$sh\s*([\x00-\xff]*)/ && do {
1296 $cmd =~ /^$rc([^$rc].*)$/ && do {
1298 pop(@hist) if length($cmd) > 1;
1299 for ($i = $#hist; $i; --$i) {
1300 last if $hist[$i] =~ /$pat/;
1303 print $OUT "No such command!\n\n";
1307 print $OUT $cmd, "\n";
1309 $cmd =~ /^$sh$/ && do {
1310 &system($ENV{SHELL}||"/bin/sh");
1312 $cmd =~ /^$sh\s*([\x00-\xff]*)/ && do {
1313 # XXX: using csh or tcsh destroys sigint retvals!
1314 #&system($1); # use this instead
1315 &system($ENV{SHELL}||"/bin/sh","-c",$1);
1317 $cmd =~ /^H\b\s*(-(\d+))?/ && do {
1318 $end = $2 ? ($#hist-$2) : 0;
1319 $hist = 0 if $hist < 0;
1320 for ($i=$#hist; $i>$end; $i--) {
1321 print $OUT "$i: ",$hist[$i],"\n"
1322 unless $hist[$i] =~ /^.?$/;
1325 $cmd =~ /^(?:man|(?:perl)?doc)\b(?:\s+([^(]*))?$/ && do {
1328 $cmd =~ s/^p$/print {\$DB::OUT} \$_/;
1329 $cmd =~ s/^p\b/print {\$DB::OUT} /;
1330 $cmd =~ s/^=\s*// && do {
1332 if (length $cmd == 0) {
1333 @keys = sort keys %alias;
1335 elsif (my($k,$v) = ($cmd =~ /^(\S+)\s+(\S.*)/)) {
1336 # can't use $_ or kill //g state
1337 for my $x ($k, $v) { $x =~ s/\a/\\a/g }
1338 $alias{$k} = "s\a$k\a$v\a";
1339 # squelch the sigmangler
1340 local $SIG{__DIE__};
1341 local $SIG{__WARN__};
1342 unless (eval "sub { s\a$k\a$v\a }; 1") {
1343 print $OUT "Can't alias $k to $v: $@\n";
1353 if ((my $v = $alias{$k}) =~ s
\as\a$k\a(.*)\a$
\a1
\a) {
1354 print $OUT "$k\t= $1\n";
1356 elsif (defined $alias{$k}) {
1357 print $OUT "$k\t$alias{$k}\n";
1360 print "No alias for $k\n";
1364 $cmd =~ /^\|\|?\s*[^|]/ && do {
1365 if ($pager =~ /^\|/) {
1366 open(SAVEOUT,">&STDOUT") || &warn("Can't save STDOUT");
1367 open(STDOUT,">&OUT") || &warn("Can't redirect STDOUT");
1369 open(SAVEOUT,">&OUT") || &warn("Can't save DB::OUT");
1372 unless ($piped=open(OUT,$pager)) {
1373 &warn("Can't pipe output to `$pager'");
1374 if ($pager =~ /^\|/) {
1375 open(OUT,">&STDOUT") # XXX: lost message
1376 || &warn("Can't restore DB::OUT");
1377 open(STDOUT,">&SAVEOUT")
1378 || &warn("Can't restore STDOUT");
1381 open(OUT,">&STDOUT") # XXX: lost message
1382 || &warn("Can't restore DB::OUT");
1386 $SIG{PIPE}= \&DB::catch if $pager =~ /^\|/
1387 && ("" eq $SIG{PIPE} || "DEFAULT" eq $SIG{PIPE});
1388 $selected= select(OUT);
1390 select( $selected ), $selected= "" unless $cmd =~ /^\|\|/;
1391 $cmd =~ s/^\|+\s*//;
1394 # XXX Local variants do not work!
1395 $cmd =~ s/^t\s/\$DB::trace |= 1;\n/;
1396 $cmd =~ s/^s\s/\$DB::single = 1;\n/ && do {$laststep = 's'};
1397 $cmd =~ s/^n\s/\$DB::single = 2;\n/ && do {$laststep = 'n'};
1399 $evalarg = "\$^D = \$^D | \$DB::db_stop;\n$cmd"; &eval;
1401 $onetimeDump = undef;
1402 } elsif ($term_pid == $$) {
1407 if ($pager =~ /^\|/) {
1409 # we cannot warn here: the handle is missing --tchrist
1410 close(OUT) || print SAVEOUT "\nCan't close DB::OUT\n";
1412 # most of the $? crud was coping with broken cshisms
1414 print SAVEOUT "Pager `$pager' failed: ";
1416 print SAVEOUT "shell returned -1\n";
1419 ( $? & 127 ) ? " (SIG#".($?&127).")" : "",
1420 ( $? & 128 ) ? " -- core dumped" : "", "\n";
1422 print SAVEOUT "status ", ($? >> 8), "\n";
1426 open(OUT,">&STDOUT") || &warn("Can't restore DB::OUT");
1427 open(STDOUT,">&SAVEOUT") || &warn("Can't restore STDOUT");
1428 $SIG{PIPE} = "DEFAULT" if $SIG{PIPE} eq \&DB::catch;
1429 # Will stop ignoring SIGPIPE if done like nohup(1)
1430 # does SIGINT but Perl doesn't give us a choice.
1432 open(OUT,">&SAVEOUT") || &warn("Can't restore DB::OUT");
1435 select($selected), $selected= "" unless $selected eq "";
1439 $fall_off_end = 1 unless defined $cmd; # Emulate `q' on EOF
1440 foreach $evalarg (@$post) {
1443 } # if ($single || $signal)
1444 ($@, $!, $^E, $,, $/, $\, $^W) = @saved;
1448 # The following code may be executed now:
1452 my ($al, $ret, @ret) = "";
1453 if (length($sub) > 10 && substr($sub, -10, 10) eq '::AUTOLOAD') {
1456 local $stack_depth = $stack_depth + 1; # Protect from non-local exits
1457 $#stack = $stack_depth;
1458 $stack[-1] = $single;
1460 $single |= 4 if $stack_depth == $deep;
1462 ? ( print_lineinfo(' ' x ($stack_depth - 1), "in "),
1463 # Why -1? But it works! :-(
1464 print_trace($LINEINFO, -1, 1, 1, "$sub$al") )
1465 : print_lineinfo(' ' x ($stack_depth - 1), "entering $sub$al\n")) if $frame;
1468 $single |= $stack[$stack_depth--];
1470 ? ( print_lineinfo(' ' x $stack_depth, "out "),
1471 print_trace($LINEINFO, -1, 1, 1, "$sub$al") )
1472 : print_lineinfo(' ' x $stack_depth, "exited $sub$al\n")) if $frame & 2;
1473 if ($doret eq $stack_depth or $frame & 16) {
1474 my $fh = ($doret eq $stack_depth ? $OUT : $LINEINFO);
1475 print $fh ' ' x $stack_depth if $frame & 16;
1476 print $fh "list context return from $sub:\n";
1477 dumpit($fh, \@ret );
1482 if (defined wantarray) {
1487 $single |= $stack[$stack_depth--];
1489 ? ( print_lineinfo(' ' x $stack_depth, "out "),
1490 print_trace($LINEINFO, -1, 1, 1, "$sub$al") )
1491 : print_lineinfo(' ' x $stack_depth, "exited $sub$al\n")) if $frame & 2;
1492 if ($doret eq $stack_depth or $frame & 16 and defined wantarray) {
1493 my $fh = ($doret eq $stack_depth ? $OUT : $LINEINFO);
1494 print $fh (' ' x $stack_depth) if $frame & 16;
1495 print $fh (defined wantarray
1496 ? "scalar context return from $sub: "
1497 : "void context return from $sub\n");
1498 dumpit( $fh, $ret ) if defined wantarray;
1507 ### Functions with multiple modes of failure die on error, the rest
1508 ### returns FALSE on error.
1509 ### User-interface functions cmd_* output error message.
1513 $break_on_load{$file} = 1;
1514 $had_breakpoints{$file} |= 1;
1517 sub report_break_on_load {
1518 sort keys %break_on_load;
1526 push @files, $::INC{$file} if $::INC{$file};
1527 $file .= '.pm', redo unless $file =~ /\./;
1529 break_on_load($_) for @files;
1530 my @files = report_break_on_load;
1531 print $OUT "Will stop on load of `@files'.\n";
1534 $filename_error = '';
1536 sub breakable_line {
1537 my ($from, $to) = @_;
1540 my $delta = $from < $to ? +1 : -1;
1541 my $limit = $delta > 0 ? $#dbline : 1;
1542 $limit = $to if ($limit - $to) * $delta > 0;
1543 $i += $delta while $dbline[$i] == 0 and ($limit - $i) * $delta > 0;
1545 return $i unless $dbline[$i] == 0;
1546 my ($pl, $upto) = ('', '');
1547 ($pl, $upto) = ('s', "..$to") if @_ >=2 and $from != $to;
1548 die "Line$pl $from$upto$filename_error not breakable\n";
1551 sub breakable_line_in_filename {
1553 local *dbline = $main::{'_<' . $f};
1554 local $filename_error = " of `$f'";
1559 my ($i, $cond) = @_;
1560 $cond = 1 unless @_ >= 2;
1564 die "Line $i$filename_error not breakable.\n" if $dbline[$i] == 0;
1565 $had_breakpoints{$filename} |= 1;
1566 $dbline{$i} =~ s/^[^\0]*/$cond/;
1570 eval { break_on_line(@_); 1 } or print $OUT $@ and return;
1573 sub break_on_filename_line {
1574 my ($f, $i, $cond) = @_;
1575 $cond = 1 unless @_ >= 3;
1576 local *dbline = $main::{'_<' . $f};
1577 local $filename_error = " of `$f'";
1578 local $filename = $f;
1579 break_on_line($i, $cond);
1582 sub break_on_filename_line_range {
1583 my ($f, $from, $to, $cond) = @_;
1584 my $i = breakable_line_in_filename($f, $from, $to);
1585 $cond = 1 unless @_ >= 3;
1586 break_on_filename_line($f,$i,$cond);
1589 sub subroutine_filename_lines {
1590 my ($subname,$cond) = @_;
1591 # Filename below can contain ':'
1592 find_sub($subname) =~ /^(.*):(\d+)-(\d+)$/;
1595 sub break_subroutine {
1596 my $subname = shift;
1597 my ($file,$s,$e) = subroutine_filename_lines($subname) or
1598 die "Subroutine $subname not found.\n";
1599 $cond = 1 unless @_ >= 2;
1600 break_on_filename_line_range($file,$s,$e,@_);
1604 my ($subname,$cond) = @_;
1605 $cond = 1 unless @_ >= 2;
1606 unless (ref $subname eq 'CODE') {
1607 $subname =~ s/\'/::/g;
1609 $subname = "${'package'}::" . $subname
1610 unless $subname =~ /::/;
1611 $subname = "CORE::GLOBAL::$s"
1612 if not defined &$subname and $s !~ /::/ and defined &{"CORE::GLOBAL::$s"};
1613 $subname = "main".$subname if substr($subname,0,2) eq "::";
1615 eval { break_subroutine($subname,$cond); 1 } or print $OUT $@ and return;
1618 sub cmd_stop { # As on ^C, but not signal-safy.
1622 sub delete_breakpoint {
1624 die "Line $i not breakable.\n" if $dbline[$i] == 0;
1625 $dbline{$i} =~ s/^[^\0]*//;
1626 delete $dbline{$i} if $dbline{$i} eq '';
1631 eval { delete_breakpoint $i; 1 } or print $OUT $@ and return;
1634 ### END of the API section
1637 @saved = ($@, $!, $^E, $,, $/, $\, $^W);
1638 $, = ""; $/ = "\n"; $\ = ""; $^W = 0;
1641 sub print_lineinfo {
1642 resetterm(1) if $LINEINFO eq $OUT and $term_pid != $$;
1646 # The following takes its argument via $evalarg to preserve current @_
1649 # 'my' would make it visible from user code
1650 # but so does local! --tchrist [... into @DB::res, not @res. IZ]
1653 local $otrace = $trace;
1654 local $osingle = $single;
1656 { ($evalarg) = $evalarg =~ /(.*)/s; }
1657 @res = eval "$usercontext $evalarg;\n"; # '\n' for nice recursive debug
1663 local $saved[0]; # Preserve the old value of $@
1667 } elsif ($onetimeDump eq 'dump') {
1668 dumpit($OUT, \@res);
1669 } elsif ($onetimeDump eq 'methods') {
1676 my $subname = shift;
1677 if ($postponed{$subname} =~ s/^break\s([+-]?\d+)\s+if\s//) {
1678 my $offset = $1 || 0;
1679 # Filename below can contain ':'
1680 my ($file,$i) = (find_sub($subname) =~ /^(.*):(\d+)-.*$/);
1683 local *dbline = $main::{'_<' . $file};
1684 local $^W = 0; # != 0 is magical below
1685 $had_breakpoints{$file} |= 1;
1687 ++$i until $dbline[$i] != 0 or $i >= $max;
1688 $dbline{$i} = delete $postponed{$subname};
1690 print $OUT "Subroutine $subname not found.\n";
1694 elsif ($postponed{$subname} eq 'compile') { $signal = 1 }
1695 #print $OUT "In postponed_sub for `$subname'.\n";
1699 if ($ImmediateStop) {
1703 return &postponed_sub
1704 unless ref \$_[0] eq 'GLOB'; # A subroutine is compiled.
1705 # Cannot be done before the file is compiled
1706 local *dbline = shift;
1707 my $filename = $dbline;
1708 $filename =~ s/^_<//;
1709 $signal = 1, print $OUT "'$filename' loaded...\n"
1710 if $break_on_load{$filename};
1711 print_lineinfo(' ' x $stack_depth, "Package $filename.\n") if $frame;
1712 return unless $postponed_file{$filename};
1713 $had_breakpoints{$filename} |= 1;
1714 #%dbline = %{$postponed_file{$filename}}; # Cannot be done: unsufficient magic
1716 for $key (keys %{$postponed_file{$filename}}) {
1717 $dbline{$key} = ${$postponed_file{$filename}}{$key};
1719 delete $postponed_file{$filename};
1723 local ($savout) = select(shift);
1724 my $osingle = $single;
1725 my $otrace = $trace;
1726 $single = $trace = 0;
1729 unless (defined &main::dumpValue) {
1732 if (defined &main::dumpValue) {
1733 &main::dumpValue(shift);
1735 print $OUT "dumpvar.pl not available.\n";
1742 # Tied method do not create a context, so may get wrong message:
1746 resetterm(1) if $fh eq $LINEINFO and $LINEINFO eq $OUT and $term_pid != $$;
1747 my @sub = dump_trace($_[0] + 1, $_[1]);
1748 my $short = $_[2]; # Print short report, next one for sub name
1750 for ($i=0; $i <= $#sub; $i++) {
1753 my $args = defined $sub[$i]{args}
1754 ? "(@{ $sub[$i]{args} })"
1756 $args = (substr $args, 0, $maxtrace - 3) . '...'
1757 if length $args > $maxtrace;
1758 my $file = $sub[$i]{file};
1759 $file = $file eq '-e' ? $file : "file `$file'" unless $short;
1761 $s = (substr $s, 0, $maxtrace - 3) . '...' if length $s > $maxtrace;
1763 my $sub = @_ >= 4 ? $_[3] : $s;
1764 print $fh "$sub[$i]{context}=$sub$args from $file:$sub[$i]{line}\n";
1766 print $fh "$sub[$i]{context} = $s$args" .
1767 " called from $file" .
1768 " line $sub[$i]{line}\n";
1775 my $count = shift || 1e9;
1778 my ($p,$file,$line,$sub,$h,$args,$e,$r,@a,@sub,$context);
1779 my $nothard = not $frame & 8;
1780 local $frame = 0; # Do not want to trace this.
1781 my $otrace = $trace;
1784 $i < $count and ($p,$file,$line,$sub,$h,$context,$e,$r) = caller($i);
1789 if (not defined $arg) {
1791 } elsif ($nothard and tied $arg) {
1793 } elsif ($nothard and $type = ref $arg) {
1794 push @a, "ref($type)";
1796 local $_ = "$arg"; # Safe to stringify now - should not call f().
1799 unless /^(?: -?[\d.]+ | \*[\w:]* )$/x;
1800 s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
1801 s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
1805 $context = $context ? '@' : (defined $context ? "\$" : '.');
1806 $args = $h ? [@a] : undef;
1807 $e =~ s/\n\s*\;\s*\Z// if $e;
1808 $e =~ s/([\\\'])/\\$1/g if $e;
1810 $sub = "require '$e'";
1811 } elsif (defined $r) {
1813 } elsif ($sub eq '(eval)') {
1814 $sub = "eval {...}";
1816 push(@sub, {context => $context, sub => $sub, args => $args,
1817 file => $file, line => $line});
1826 while ($action =~ s/\\$//) {
1835 # i hate using globals!
1836 $balanced_brace_re ||= qr{
1839 (?> [^{}] + ) # Non-parens without backtracking
1841 (??{ $balanced_brace_re }) # Group with matching parens
1845 return $_[0] !~ m/$balanced_brace_re/;
1849 &readline("cont: ");
1853 # We save, change, then restore STDIN and STDOUT to avoid fork() since
1854 # some non-Unix systems can do system() but have problems with fork().
1855 open(SAVEIN,"<&STDIN") || &warn("Can't save STDIN");
1856 open(SAVEOUT,">&STDOUT") || &warn("Can't save STDOUT");
1857 open(STDIN,"<&IN") || &warn("Can't redirect STDIN");
1858 open(STDOUT,">&OUT") || &warn("Can't redirect STDOUT");
1860 # XXX: using csh or tcsh destroys sigint retvals!
1862 open(STDIN,"<&SAVEIN") || &warn("Can't restore STDIN");
1863 open(STDOUT,">&SAVEOUT") || &warn("Can't restore STDOUT");
1868 # most of the $? crud was coping with broken cshisms
1870 &warn("(Command exited ", ($? >> 8), ")\n");
1872 &warn( "(Command died of SIG#", ($? & 127),
1873 (($? & 128) ? " -- core dumped" : "") , ")", "\n");
1883 eval { require Term::ReadLine } or die $@;
1886 my ($i, $o) = split $tty, /,/;
1887 $o = $i unless defined $o;
1888 open(IN,"<$i") or die "Cannot open TTY `$i' for read: $!";
1889 open(OUT,">$o") or die "Cannot open TTY `$o' for write: $!";
1892 my $sel = select($OUT);
1896 eval "require Term::Rendezvous;" or die;
1897 my $rv = $ENV{PERLDB_NOTTY} || "/tmp/perldbtty$$";
1898 my $term_rv = new Term::Rendezvous $rv;
1900 $OUT = $term_rv->OUT;
1903 if ($term_pid eq '-1') { # In a TTY with another debugger
1907 $term = new Term::ReadLine::Stub 'perldb', $IN, $OUT;
1909 $term = new Term::ReadLine 'perldb', $IN, $OUT;
1911 $rl_attribs = $term->Attribs;
1912 $rl_attribs->{basic_word_break_characters} .= '-:+/*,[])}'
1913 if defined $rl_attribs->{basic_word_break_characters}
1914 and index($rl_attribs->{basic_word_break_characters}, ":") == -1;
1915 $rl_attribs->{special_prefixes} = '$@&%';
1916 $rl_attribs->{completer_word_break_characters} .= '$@&%';
1917 $rl_attribs->{completion_function} = \&db_complete;
1919 $LINEINFO = $OUT unless defined $LINEINFO;
1920 $lineinfo = $console unless defined $lineinfo;
1922 if ($term->Features->{setHistory} and "@hist" ne "?") {
1923 $term->SetHistory(@hist);
1925 ornaments($ornaments) if defined $ornaments;
1929 # Example get_fork_TTY functions
1930 sub xterm_get_fork_TTY {
1931 (my $name = $0) =~ s,^.*[/\\],,s;
1932 open XT, qq[3>&1 xterm -title "Daughter Perl debugger $pids $name" -e sh -c 'tty 1>&3;\
1936 $pidprompt = ''; # Shown anyway in titlebar
1940 # This one resets $IN, $OUT itself
1941 sub os2_get_fork_TTY {
1942 $^F = 40; # XXXX Fixme!
1943 my ($in1, $out1, $in2, $out2);
1944 # Having -d in PERL5OPT would lead to a disaster...
1945 local $ENV{PERL5OPT} = $ENV{PERL5OPT} if $ENV{PERL5OPT};
1946 $ENV{PERL5OPT} =~ s/(?:^|(?<=\s))-d\b// if $ENV{PERL5OPT};
1947 $ENV{PERL5OPT} =~ s/(?:^|(?<=\s))-d\B/-/ if $ENV{PERL5OPT};
1948 print $OUT "Making PERL5OPT->`$ENV{PERL5OPT}'.\n" if $ENV{PERL5OPT};
1949 (my $name = $0) =~ s,^.*[/\\],,s;
1950 if ( pipe $in1, $out1 and pipe $in2, $out2 and
1951 # system P_SESSION will fail if there is another process
1952 # in the same session with a "dependent" asyncroneous child session.
1953 (($kpid = system 4, $^X, '-we', <<'ES', fileno $in1, fileno $out2, "Daughter Perl debugger $pids $name") >= 0 or warn "system P_SESSION: $!, $^E" and 0) # P_SESSION
1957 my $in = shift; # Read from here and pass through
1959 system P_NOWAIT, $^X, '-we', <<EOS or die "Cannot start a grandkid";
1960 open IN, '<&=$in' or die "open <&=$in: \$!";
1961 \$| = 1; print while sysread IN, \$_, 1<<16;
1965 open OUT, ">&=$out" or die "Cannot open &=$out for writing: $!";
1967 ReadMode 4; # Nodelay on kbd. Pipe is automatically nodelay...
1968 print while sysread STDIN, $_, 1<<16;
1970 and close $in1 and close $out2 ) {
1971 $pidprompt = ''; # Shown anyway in titlebar
1972 reset_IN_OUT($in2, $out1);
1974 return ''; # Indicate that reset_IN_OUT is called
1979 sub create_IN_OUT { # Create a window with IN/OUT handles redirected there
1980 my $in = &get_fork_TTY if defined &get_fork_TTY;
1981 $in = $fork_TTY if defined $fork_TTY; # Backward compatibility
1982 if (not defined $in) {
1984 print_help(<<EOP) if $why == 1;
1985 I<#########> Forked, but do not know how to create a new B<TTY>. I<#########>
1987 print_help(<<EOP) if $why == 2;
1988 I<#########> Daughter session, do not know how to change a B<TTY>. I<#########>
1989 This may be an asyncroneous session, so the parent debugger may be active.
1991 print_help(<<EOP) if $why != 4;
1992 Since two debuggers fight for the same TTY, input is severely entangled.
1996 I know how to switch the output to a different window in xterms
1997 and OS/2 consoles only. For a manual switch, put the name of the created I<TTY>
1998 in B<\$DB::fork_TTY>, or define a function B<DB::get_fork_TTY()> returning this.
2000 On I<UNIX>-like systems one can get the name of a I<TTY> for the given window
2001 by typing B<tty>, and disconnect the I<shell> from I<TTY> by B<sleep 1000000>.
2004 } elsif ($in ne '') {
2010 sub resetterm { # We forked, so we need a different TTY
2012 my $systemed = $in > 1 ? '-' : '';
2014 $pids =~ s/\]/$systemed->$$]/;
2016 $pids = "[$term_pid->$$]";
2020 return unless $CreateTTY & $in;
2027 my $left = @typeahead;
2028 my $got = shift @typeahead;
2029 print $OUT "auto(-$left)", shift, $got, "\n";
2030 $term->AddHistory($got)
2031 if length($got) > 1 and defined $term->Features->{addHistory};
2036 if (ref $OUT and UNIVERSAL::isa($OUT, 'IO::Socket::INET')) {
2037 $OUT->write(join('', @_));
2039 $IN->recv( $stuff, 2048 ); # XXX: what's wrong with sysread?
2043 $term->readline(@_);
2048 my ($opt, $val)= @_;
2049 $val = option_val($opt,'N/A');
2050 $val =~ s/([\\\'])/\\$1/g;
2051 printf $OUT "%20s = '%s'\n", $opt, $val;
2055 my ($opt, $default)= @_;
2057 if (defined $optionVars{$opt}
2058 and defined ${$optionVars{$opt}}) {
2059 $val = ${$optionVars{$opt}};
2060 } elsif (defined $optionAction{$opt}
2061 and defined &{$optionAction{$opt}}) {
2062 $val = &{$optionAction{$opt}}();
2063 } elsif (defined $optionAction{$opt}
2064 and not defined $option{$opt}
2065 or defined $optionVars{$opt}
2066 and not defined ${$optionVars{$opt}}) {
2069 $val = $option{$opt};
2076 # too dangerous to let intuitive usage overwrite important things
2077 # defaultion should never be the default
2078 my %opt_needs_val = map { ( $_ => 1 ) } qw{
2079 arrayDepth hashDepth LineInfo maxTraceLen ornaments
2080 pager quote ReadLine recallCommand RemotePort ShellBang TTY
2085 s/^(\w+)(\W?)// or print($OUT "Invalid option `$_'\n"), last;
2086 my ($opt,$sep) = ($1,$2);
2089 print($OUT "Option query `$opt?' followed by non-space `$_'\n"), last
2091 #&dump_option($opt);
2092 } elsif ($sep !~ /\S/) {
2094 $val = "1"; # this is an evil default; make 'em set it!
2095 } elsif ($sep eq "=") {
2097 if (s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x) {
2099 ($val = $2) =~ s/\\([$quote\\])/$1/g;
2103 print OUT qq(Option better cleared using $opt=""\n)
2107 } else { #{ to "let some poor schmuck bounce on the % key in B<vi>."
2108 my ($end) = "\\" . substr( ")]>}$sep", index("([<{",$sep), 1 ); #}
2109 s/^(([^\\$end]|\\[\\$end])*)$end($|\s+)// or
2110 print($OUT "Unclosed option value `$opt$sep$_'\n"), last;
2111 ($val = $1) =~ s/\\([\\$end])/$1/g;
2115 my $matches = grep( /^\Q$opt/ && ($option = $_), @options )
2116 || grep( /^\Q$opt/i && ($option = $_), @options );
2118 print($OUT "Unknown option `$opt'\n"), next unless $matches;
2119 print($OUT "Ambiguous option `$opt'\n"), next if $matches > 1;
2121 if ($opt_needs_val{$option} && $val_defaulted) {
2122 print $OUT "Option `$opt' is non-boolean. Use `O $option=VAL' to set, `O $option?' to query\n";
2126 $option{$option} = $val if defined $val;
2131 require '$optionRequire{$option}';
2133 } || die # XXX: shouldn't happen
2134 if defined $optionRequire{$option} &&
2137 ${$optionVars{$option}} = $val
2138 if defined $optionVars{$option} &&
2141 &{$optionAction{$option}} ($val)
2142 if defined $optionAction{$option} &&
2143 defined &{$optionAction{$option}} &&
2147 dump_option($option) unless $OUT eq \*STDERR;
2152 my ($stem,@list) = @_;
2154 $ENV{"${stem}_n"} = @list;
2155 for $i (0 .. $#list) {
2157 $val =~ s/\\/\\\\/g;
2158 $val =~ s/([\0-\37\177\200-\377])/"\\0x" . unpack('H2',$1)/eg;
2159 $ENV{"${stem}_$i"} = $val;
2166 my $n = delete $ENV{"${stem}_n"};
2168 for $i (0 .. $n - 1) {
2169 $val = delete $ENV{"${stem}_$i"};
2170 $val =~ s/\\((\\)|0x(..))/ $2 ? $2 : pack('H2', $3) /ge;
2178 return; # Put nothing on the stack - malloc/free land!
2182 my($msg)= join("",@_);
2183 $msg .= ": $!\n" unless $msg =~ /\n$/;
2188 my $switch_li = $LINEINFO eq $OUT;
2189 if ($term and $term->Features->{newTTY}) {
2190 ($IN, $OUT) = (shift, shift);
2191 $term->newTTY($IN, $OUT);
2193 &warn("Too late to set IN/OUT filehandles, enabled on next `R'!\n");
2195 ($IN, $OUT) = (shift, shift);
2197 my $o = select $OUT;
2200 $LINEINFO = $OUT if $switch_li;
2204 if (@_ and $term and $term->Features->{newTTY}) {
2205 my ($in, $out) = shift;
2207 ($in, $out) = split /,/, $in, 2;
2211 open IN, $in or die "cannot open `$in' for read: $!";
2212 open OUT, ">$out" or die "cannot open `$out' for write: $!";
2213 reset_IN_OUT(\*IN,\*OUT);
2216 &warn("Too late to set TTY, enabled on next `R'!\n") if $term and @_;
2217 # Useful if done through PERLDB_OPTS:
2224 &warn("Too late to set noTTY, enabled on next `R'!\n") if @_;
2226 $notty = shift if @_;
2232 &warn("Too late to set ReadLine, enabled on next `R'!\n") if @_;
2240 &warn("Too late to set RemotePort, enabled on next 'R'!\n") if @_;
2242 $remoteport = shift if @_;
2247 if (${$term->Features}{tkRunning}) {
2248 return $term->tkRunning(@_);
2250 print $OUT "tkRunning not supported by current ReadLine package.\n";
2257 &warn("Too late to set up NonStop mode, enabled on next `R'!\n") if @_;
2259 $runnonstop = shift if @_;
2266 $pager="|".$pager unless $pager =~ /^(\+?\>|\|)/;
2273 $sh = quotemeta shift;
2274 $sh .= "\\b" if $sh =~ /\w$/;
2278 $psh =~ s/\\(.)/$1/g;
2284 if (defined $term) {
2285 local ($warnLevel,$dieLevel) = (0, 1);
2286 return '' unless $term->Features->{ornaments};
2287 eval { $term->ornaments(@_) } || '';
2295 $rc = quotemeta shift;
2296 $rc .= "\\b" if $rc =~ /\w$/;
2300 $prc =~ s/\\(.)/$1/g;
2306 return $lineinfo unless @_;
2308 my $stream = ($lineinfo =~ /^(\+?\>|\|)/) ? $lineinfo : ">$lineinfo";
2309 $slave_editor = ($stream =~ /^\|/);
2310 open(LINEINFO, "$stream") || &warn("Cannot open `$stream' for write");
2311 $LINEINFO = \*LINEINFO;
2312 my $save = select($LINEINFO);
2326 s/^Term::ReadLine::readline$/readline/;
2327 if (defined ${ $_ . '::VERSION' }) {
2328 $version{$file} = "${ $_ . '::VERSION' } from ";
2330 $version{$file} .= $INC{$file};
2332 dumpit($OUT,\%version);
2336 # XXX: make sure these are tabs between the command and explantion,
2337 # or print_help will screw up your formatting if you have
2338 # eeevil ornaments enabled. This is an insane mess.
2342 B<s> [I<expr>] Single step [in I<expr>].
2343 B<n> [I<expr>] Next, steps over subroutine calls [in I<expr>].
2344 <B<CR>> Repeat last B<n> or B<s> command.
2345 B<r> Return from current subroutine.
2346 B<c> [I<line>|I<sub>] Continue; optionally inserts a one-time-only breakpoint
2347 at the specified position.
2348 B<l> I<min>B<+>I<incr> List I<incr>+1 lines starting at I<min>.
2349 B<l> I<min>B<->I<max> List lines I<min> through I<max>.
2350 B<l> I<line> List single I<line>.
2351 B<l> I<subname> List first window of lines from subroutine.
2352 B<l> I<\$var> List first window of lines from subroutine referenced by I<\$var>.
2353 B<l> List next window of lines.
2354 B<-> List previous window of lines.
2355 B<w> [I<line>] List window around I<line>.
2356 B<.> Return to the executed line.
2357 B<f> I<filename> Switch to viewing I<filename>. File must be already loaded.
2358 I<filename> may be either the full name of the file, or a regular
2359 expression matching the full file name:
2360 B<f> I</home/me/foo.pl> and B<f> I<oo\\.> may access the same file.
2361 Evals (with saved bodies) are considered to be filenames:
2362 B<f> I<(eval 7)> and B<f> I<eval 7\\b> access the body of the 7th eval
2363 (in the order of execution).
2364 B</>I<pattern>B</> Search forwards for I<pattern>; final B</> is optional.
2365 B<?>I<pattern>B<?> Search backwards for I<pattern>; final B<?> is optional.
2366 B<L> List all breakpoints and actions.
2367 B<S> [[B<!>]I<pattern>] List subroutine names [not] matching I<pattern>.
2368 B<t> Toggle trace mode.
2369 B<t> I<expr> Trace through execution of I<expr>.
2370 B<b> [I<line>] [I<condition>]
2371 Set breakpoint; I<line> defaults to the current execution line;
2372 I<condition> breaks if it evaluates to true, defaults to '1'.
2373 B<b> I<subname> [I<condition>]
2374 Set breakpoint at first line of subroutine.
2375 B<b> I<\$var> Set breakpoint at first line of subroutine referenced by I<\$var>.
2376 B<b> B<load> I<filename> Set breakpoint on `require'ing the given file.
2377 B<b> B<postpone> I<subname> [I<condition>]
2378 Set breakpoint at first line of subroutine after
2380 B<b> B<compile> I<subname>
2381 Stop after the subroutine is compiled.
2382 B<d> [I<line>] Delete the breakpoint for I<line>.
2383 B<D> Delete all breakpoints.
2384 B<a> [I<line>] I<command>
2385 Set an action to be done before the I<line> is executed;
2386 I<line> defaults to the current execution line.
2387 Sequence is: check for breakpoint/watchpoint, print line
2388 if necessary, do action, prompt user if necessary,
2390 B<a> [I<line>] Delete the action for I<line>.
2391 B<A> Delete all actions.
2392 B<W> I<expr> Add a global watch-expression.
2393 B<W> Delete all watch-expressions.
2394 B<V> [I<pkg> [I<vars>]] List some (default all) variables in package (default current).
2395 Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps.
2396 B<X> [I<vars>] Same as \"B<V> I<currentpackage> [I<vars>]\".
2397 B<x> I<expr> Evals expression in list context, dumps the result.
2398 B<m> I<expr> Evals expression in list context, prints methods callable
2399 on the first element of the result.
2400 B<m> I<class> Prints methods callable via the given class.
2402 B<<> ? List Perl commands to run before each prompt.
2403 B<<> I<expr> Define Perl command to run before each prompt.
2404 B<<<> I<expr> Add to the list of Perl commands to run before each prompt.
2405 B<>> ? List Perl commands to run after each prompt.
2406 B<>> I<expr> Define Perl command to run after each prompt.
2407 B<>>B<>> I<expr> Add to the list of Perl commands to run after each prompt.
2408 B<{> I<db_command> Define debugger command to run before each prompt.
2409 B<{> ? List debugger commands to run before each prompt.
2410 B<<> I<expr> Define Perl command to run before each prompt.
2411 B<{{> I<db_command> Add to the list of debugger commands to run before each prompt.
2412 B<$prc> I<number> Redo a previous command (default previous command).
2413 B<$prc> I<-number> Redo number'th-to-last command.
2414 B<$prc> I<pattern> Redo last command that started with I<pattern>.
2415 See 'B<O> I<recallCommand>' too.
2416 B<$psh$psh> I<cmd> Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)"
2417 . ( $rc eq $sh ? "" : "
2418 B<$psh> [I<cmd>] Run I<cmd> in subshell (forces \"\$SHELL -c 'cmd'\")." ) . "
2419 See 'B<O> I<shellBang>' too.
2420 B<H> I<-number> Display last number commands (default all).
2421 B<p> I<expr> Same as \"I<print {DB::OUT} expr>\" in current package.
2422 B<|>I<dbcmd> Run debugger command, piping DB::OUT to current pager.
2423 B<||>I<dbcmd> Same as B<|>I<dbcmd> but DB::OUT is temporarilly select()ed as well.
2424 B<\=> [I<alias> I<value>] Define a command alias, or list current aliases.
2425 I<command> Execute as a perl statement in current package.
2426 B<v> Show versions of loaded modules.
2427 B<R> Pure-man-restart of debugger, some of debugger state
2428 and command-line options may be lost.
2429 Currently the following setting are preserved:
2430 history, breakpoints and actions, debugger B<O>ptions
2431 and the following command-line options: I<-w>, I<-I>, I<-e>.
2433 B<O> [I<opt>] ... Set boolean option to true
2434 B<O> [I<opt>B<?>] Query options
2435 B<O> [I<opt>B<=>I<val>] [I<opt>=B<\">I<val>B<\">] ...
2436 Set options. Use quotes in spaces in value.
2437 I<recallCommand>, I<ShellBang> chars used to recall command or spawn shell;
2438 I<pager> program for output of \"|cmd\";
2439 I<tkRunning> run Tk while prompting (with ReadLine);
2440 I<signalLevel> I<warnLevel> I<dieLevel> level of verbosity;
2441 I<inhibit_exit> Allows stepping off the end of the script.
2442 I<ImmediateStop> Debugger should stop as early as possible.
2443 I<RemotePort> Remote hostname:port for remote debugging
2444 The following options affect what happens with B<V>, B<X>, and B<x> commands:
2445 I<arrayDepth>, I<hashDepth> print only first N elements ('' for all);
2446 I<compactDump>, I<veryCompact> change style of array and hash dump;
2447 I<globPrint> whether to print contents of globs;
2448 I<DumpDBFiles> dump arrays holding debugged files;
2449 I<DumpPackages> dump symbol tables of packages;
2450 I<DumpReused> dump contents of \"reused\" addresses;
2451 I<quote>, I<HighBit>, I<undefPrint> change style of string dump;
2452 I<bareStringify> Do not print the overload-stringified value;
2453 Other options include:
2454 I<PrintRet> affects printing of return value after B<r> command,
2455 I<frame> affects printing messages on entry and exit from subroutines.
2456 I<AutoTrace> affects printing messages on every possible breaking point.
2457 I<maxTraceLen> gives maximal length of evals/args listed in stack trace.
2458 I<ornaments> affects screen appearance of the command line.
2459 I<CreateTTY> bits control attempts to create a new TTY on events:
2460 1: on fork() 2: debugger is started inside debugger
2462 During startup options are initialized from \$ENV{PERLDB_OPTS}.
2463 You can put additional initialization options I<TTY>, I<noTTY>,
2464 I<ReadLine>, I<NonStop>, and I<RemotePort> there (or use
2465 `B<R>' after you set them).
2467 B<q> or B<^D> Quit. Set B<\$DB::finished = 0> to debug global destruction.
2468 B<h> [I<db_command>] Get help [on a specific debugger command], enter B<|h> to page.
2469 B<h h> Summary of debugger commands.
2470 B<$doccmd> I<manpage> Runs the external doc viewer B<$doccmd> command on the
2471 named Perl I<manpage>, or on B<$doccmd> itself if omitted.
2472 Set B<\$DB::doccmd> to change viewer.
2474 Type `|h' for a paged display if this was too hard to read.
2476 "; # Fix balance of vi % matching: } }}
2478 # note: tabs in the following section are not-so-helpful
2479 $summary = <<"END_SUM";
2480 I<List/search source lines:> I<Control script execution:>
2481 B<l> [I<ln>|I<sub>] List source code B<T> Stack trace
2482 B<-> or B<.> List previous/current line B<s> [I<expr>] Single step [in expr]
2483 B<w> [I<line>] List around line B<n> [I<expr>] Next, steps over subs
2484 B<f> I<filename> View source in file <B<CR>/B<Enter>> Repeat last B<n> or B<s>
2485 B</>I<pattern>B</> B<?>I<patt>B<?> Search forw/backw B<r> Return from subroutine
2486 B<v> Show versions of modules B<c> [I<ln>|I<sub>] Continue until position
2487 I<Debugger controls:> B<L> List break/watch/actions
2488 B<O> [...] Set debugger options B<t> [I<expr>] Toggle trace [trace expr]
2489 B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
2490 B<$prc> [I<N>|I<pat>] Redo a previous command B<d> [I<ln>] or B<D> Delete a/all breakpoints
2491 B<H> [I<-num>] Display last num commands B<a> [I<ln>] I<cmd> Do cmd before line
2492 B<=> [I<a> I<val>] Define/list an alias B<W> I<expr> Add a watch expression
2493 B<h> [I<db_cmd>] Get help on command B<A> or B<W> Delete all actions/watch
2494 B<|>[B<|>]I<db_cmd> Send output to pager B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess
2495 B<q> or B<^D> Quit B<R> Attempt a restart
2496 I<Data Examination:> B<expr> Execute perl code, also see: B<s>,B<n>,B<t> I<expr>
2497 B<x>|B<m> I<expr> Evals expr in list context, dumps the result or lists methods.
2498 B<p> I<expr> Print expression (uses script's current package).
2499 B<S> [[B<!>]I<pat>] List subroutine names [not] matching pattern
2500 B<V> [I<Pk> [I<Vars>]] List Variables in Package. Vars can be ~pattern or !pattern.
2501 B<X> [I<Vars>] Same as \"B<V> I<current_package> [I<Vars>]\".
2502 For more help, type B<h> I<cmd_letter>, or run B<$doccmd perldebug> for all docs.
2504 # ')}}; # Fix balance of vi % matching
2510 # Restore proper alignment destroyed by eeevil I<> and B<>
2511 # ornaments: A pox on both their houses!
2513 # A help command will have everything up to and including
2514 # the first tab sequence paddeed into a field 16 (or if indented 20)
2515 # wide. If it's wide than that, an extra space will be added.
2517 ^ # only matters at start of line
2518 ( \040{4} | \t )* # some subcommands are indented
2519 ( < ? # so <CR> works
2520 [BI] < [^\t\n] + ) # find an eeevil ornament
2521 ( \t+ ) # original separation, discarded
2522 ( .* ) # this will now start (no earlier) than
2525 my($leadwhite, $command, $midwhite, $text) = ($1, $2, $3, $4);
2526 my $clean = $command;
2527 $clean =~ s/[BI]<([^>]*)>/$1/g;
2528 # replace with this whole string:
2529 (length($leadwhite) ? " " x 4 : "")
2531 . ((" " x (16 + (length($leadwhite) ? 4 : 0) - length($clean))) || " ")
2536 s{ # handle bold ornaments
2537 B < ( [^>] + | > ) >
2539 $Term::ReadLine::TermCap::rl_term_set[2]
2541 . $Term::ReadLine::TermCap::rl_term_set[3]
2544 s{ # handle italic ornaments
2545 I < ( [^>] + | > ) >
2547 $Term::ReadLine::TermCap::rl_term_set[0]
2549 . $Term::ReadLine::TermCap::rl_term_set[1]
2556 return if defined $ENV{LESS} && $ENV{LESS} =~ /r/;
2557 my $is_less = $pager =~ /\bless\b/;
2558 if ($pager =~ /\bmore\b/) {
2559 my @st_more = stat('/usr/bin/more');
2560 my @st_less = stat('/usr/bin/less');
2561 $is_less = @st_more && @st_less
2562 && $st_more[0] == $st_less[0]
2563 && $st_more[1] == $st_less[1];
2565 # changes environment!
2566 $ENV{LESS} .= 'r' if $is_less;
2572 $SIG{'ABRT'} = 'DEFAULT';
2573 kill 'ABRT', $$ if $panic++;
2574 if (defined &Carp::longmess) {
2575 local $SIG{__WARN__} = '';
2576 local $Carp::CarpLevel = 2; # mydie + confess
2577 &warn(Carp::longmess("Signal @_"));
2580 print $DB::OUT "Got signal @_\n";
2588 local $SIG{__WARN__} = '';
2589 local $SIG{__DIE__} = '';
2590 eval { require Carp } if defined $^S; # If error/warning during compilation,
2591 # require may be broken.
2592 warn(@_, "\nCannot print stack trace, load with -MCarp option to see stack"),
2593 return unless defined &Carp::longmess;
2594 my ($mysingle,$mytrace) = ($single,$trace);
2595 $single = 0; $trace = 0;
2596 my $mess = Carp::longmess(@_);
2597 ($single,$trace) = ($mysingle,$mytrace);
2604 local $SIG{__DIE__} = '';
2605 local $SIG{__WARN__} = '';
2606 my $i = 0; my $ineval = 0; my $sub;
2607 if ($dieLevel > 2) {
2608 local $SIG{__WARN__} = \&dbwarn;
2609 &warn(@_); # Yell no matter what
2612 if ($dieLevel < 2) {
2613 die @_ if $^S; # in eval propagate
2615 eval { require Carp } if defined $^S; # If error/warning during compilation,
2616 # require may be broken.
2618 die(@_, "\nCannot print stack trace, load with -MCarp option to see stack")
2619 unless defined &Carp::longmess;
2621 # We do not want to debug this chunk (automatic disabling works
2622 # inside DB::DB, but not in Carp).
2623 my ($mysingle,$mytrace) = ($single,$trace);
2624 $single = 0; $trace = 0;
2625 my $mess = Carp::longmess(@_);
2626 ($single,$trace) = ($mysingle,$mytrace);
2632 $prevwarn = $SIG{__WARN__} unless $warnLevel;
2635 $SIG{__WARN__} = \&DB::dbwarn;
2637 $SIG{__WARN__} = $prevwarn;
2645 $prevdie = $SIG{__DIE__} unless $dieLevel;
2648 $SIG{__DIE__} = \&DB::dbdie; # if $dieLevel < 2;
2649 #$SIG{__DIE__} = \&DB::diehard if $dieLevel >= 2;
2650 print $OUT "Stack dump during die enabled",
2651 ( $dieLevel == 1 ? " outside of evals" : ""), ".\n"
2653 print $OUT "Dump printed too.\n" if $dieLevel > 2;
2655 $SIG{__DIE__} = $prevdie;
2656 print $OUT "Default die handler restored.\n";
2664 $prevsegv = $SIG{SEGV} unless $signalLevel;
2665 $prevbus = $SIG{BUS} unless $signalLevel;
2666 $signalLevel = shift;
2668 $SIG{SEGV} = \&DB::diesignal;
2669 $SIG{BUS} = \&DB::diesignal;
2671 $SIG{SEGV} = $prevsegv;
2672 $SIG{BUS} = $prevbus;
2680 my $name = CvGV_name_or_bust($in);
2681 defined $name ? $name : $in;
2684 sub CvGV_name_or_bust {
2686 return if $skipCvGV; # Backdoor to avoid problems if XS broken...
2687 $in = \&$in; # Hard reference...
2688 eval {require Devel::Peek; 1} or return;
2689 my $gv = Devel::Peek::CvGV($in) or return;
2690 *$gv{PACKAGE} . '::' . *$gv{NAME};
2696 return unless defined &$subr;
2697 my $name = CvGV_name_or_bust($subr);
2699 $data = $sub{$name} if defined $name;
2700 return $data if defined $data;
2703 $subr = \&$subr; # Hard reference
2706 $s = $_, last if $subr eq \&$_;
2714 $class = ref $class if ref $class;
2717 methods_via($class, '', 1);
2718 methods_via('UNIVERSAL', 'UNIVERSAL', 0);
2723 return if $packs{$class}++;
2725 my $prepend = $prefix ? "via $prefix: " : '';
2727 for $name (grep {defined &{${"${class}::"}{$_}}}
2728 sort keys %{"${class}::"}) {
2729 next if $seen{ $name }++;
2730 print $DB::OUT "$prepend$name\n";
2732 return unless shift; # Recurse?
2733 for $name (@{"${class}::ISA"}) {
2734 $prepend = $prefix ? $prefix . " -> $name" : $name;
2735 methods_via($name, $prepend, 1);
2740 $doccmd = $^O !~ /^(?:MSWin32|VMS|os2|dos|amigaos|riscos|MacOS)\z/s
2741 ? "man" # O Happy Day!
2742 : "perldoc"; # Alas, poor unfortunates
2748 &system("$doccmd $doccmd");
2751 # this way user can override, like with $doccmd="man -Mwhatever"
2752 # or even just "man " to disable the path check.
2753 unless ($doccmd eq 'man') {
2754 &system("$doccmd $page");
2758 $page = 'perl' if lc($page) eq 'help';
2761 my $man1dir = $Config::Config{'man1dir'};
2762 my $man3dir = $Config::Config{'man3dir'};
2763 for ($man1dir, $man3dir) { s#/[^/]*\z## if /\S/ }
2765 $manpath .= "$man1dir:" if $man1dir =~ /\S/;
2766 $manpath .= "$man3dir:" if $man3dir =~ /\S/ && $man1dir ne $man3dir;
2767 chop $manpath if $manpath;
2768 # harmless if missing, I figure
2769 my $oldpath = $ENV{MANPATH};
2770 $ENV{MANPATH} = $manpath if $manpath;
2771 my $nopathopt = $^O =~ /dunno what goes here/;
2773 # I just *know* there are men without -M
2774 (($manpath && !$nopathopt) ? ("-M", $manpath) : ()),
2777 unless ($page =~ /^perl\w/) {
2778 if (grep { $page eq $_ } qw{
2779 5004delta 5005delta amiga api apio book boot bot call compile
2780 cygwin data dbmfilter debug debguts delta diag doc dos dsc embed
2781 faq faq1 faq2 faq3 faq4 faq5 faq6 faq7 faq8 faq9 filter fork
2782 form func guts hack hist hpux intern ipc lexwarn locale lol mod
2783 modinstall modlib number obj op opentut os2 os390 pod port
2784 ref reftut run sec style sub syn thrtut tie toc todo toot tootc
2785 trap unicode var vms win32 xs xstut
2790 (($manpath && !$nopathopt) ? ("-M", $manpath) : ()),
2795 if (defined $oldpath) {
2796 $ENV{MANPATH} = $manpath;
2798 delete $ENV{MANPATH};
2802 # The following BEGIN is very handy if debugger goes havoc, debugging debugger?
2804 BEGIN { # This does not compile, alas.
2805 $IN = \*STDIN; # For bugs before DB::OUT has been opened
2806 $OUT = \*STDERR; # For errors before DB::OUT has been opened
2810 $deep = 100; # warning if stack gets this deep
2814 $SIG{INT} = \&DB::catch;
2815 # This may be enabled to debug debugger:
2816 #$warnLevel = 1 unless defined $warnLevel;
2817 #$dieLevel = 1 unless defined $dieLevel;
2818 #$signalLevel = 1 unless defined $signalLevel;
2820 $db_stop = 0; # Compiler warning
2822 $level = 0; # Level of recursive debugging
2823 # @stack and $doret are needed in sub sub, which is called for DB::postponed.
2824 # Triggers bug (?) in perl is we postpone this until runtime:
2825 @postponed = @stack = (0);
2826 $stack_depth = 0; # Localized $#stack
2831 BEGIN {$^W = $ini_warn;} # Switch warnings back
2833 #use Carp; # This did break, left for debuggin
2836 # Specific code for b c l V m f O, &blah, $blah, @blah, %blah
2837 my($text, $line, $start) = @_;
2838 my ($itext, $search, $prefix, $pack) =
2839 ($text, "^\Q${'package'}::\E([^:]+)\$");
2841 return sort grep /^\Q$text/, (keys %sub), qw(postpone load compile), # subroutines
2842 (map { /$search/ ? ($1) : () } keys %sub)
2843 if (substr $line, 0, $start) =~ /^\|*[blc]\s+((postpone|compile)\s+)?$/;
2844 return sort grep /^\Q$text/, values %INC # files
2845 if (substr $line, 0, $start) =~ /^\|*b\s+load\s+$/;
2846 return sort map {($_, db_complete($_ . "::", "V ", 2))}
2847 grep /^\Q$text/, map { /^(.*)::$/ ? ($1) : ()} keys %:: # top-packages
2848 if (substr $line, 0, $start) =~ /^\|*[Vm]\s+$/ and $text =~ /^\w*$/;
2849 return sort map {($_, db_complete($_ . "::", "V ", 2))}
2851 grep /^\Q$text/, map { /^(.*)::$/ ? ($prefix . "::$1") : ()} keys %{$prefix . '::'}
2853 if (substr $line, 0, $start) =~ /^\|*[Vm]\s+$/
2854 and $text =~ /^(.*[^:])::?(\w*)$/ and $prefix = $1;
2855 if ( $line =~ /^\|*f\s+(.*)/ ) { # Loaded files
2856 # We may want to complete to (eval 9), so $text may be wrong
2857 $prefix = length($1) - length($text);
2860 map {substr $_, 2 + $prefix} grep /^_<\Q$text/, (keys %main::), $0
2862 if ((substr $text, 0, 1) eq '&') { # subroutines
2863 $text = substr $text, 1;
2865 return sort map "$prefix$_",
2868 (map { /$search/ ? ($1) : () }
2871 if ($text =~ /^[\$@%](.*)::(.*)/) { # symbols in a package
2872 $pack = ($1 eq 'main' ? '' : $1) . '::';
2873 $prefix = (substr $text, 0, 1) . $1 . '::';
2876 = map "$prefix$_", grep /^\Q$text/, grep /^_?[a-zA-Z]/, keys %$pack ;
2877 if (@out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext) {
2878 return db_complete($out[0], $line, $start);
2882 if ($text =~ /^[\$@%]/) { # symbols (in $package + packages in main)
2883 $pack = ($package eq 'main' ? '' : $package) . '::';
2884 $prefix = substr $text, 0, 1;
2885 $text = substr $text, 1;
2886 my @out = map "$prefix$_", grep /^\Q$text/,
2887 (grep /^_?[a-zA-Z]/, keys %$pack),
2888 ( $pack eq '::' ? () : (grep /::$/, keys %::) ) ;
2889 if (@out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext) {
2890 return db_complete($out[0], $line, $start);
2894 if ((substr $line, 0, $start) =~ /^\|*O\b.*\s$/) { # Options after a space
2895 my @out = grep /^\Q$text/, @options;
2896 my $val = option_val($out[0], undef);
2898 if (not defined $val or $val =~ /[\n\r]/) {
2899 # Can do nothing better
2900 } elsif ($val =~ /\s/) {
2902 foreach $l (split //, qq/\"\'\#\|/) {
2903 $out = "$l$val$l ", last if (index $val, $l) == -1;
2908 # Default to value if one completion, to question if many
2909 $rl_attribs->{completer_terminator_character} = (@out == 1 ? $out : '? ');
2912 return $term->filename_list($text); # filenames
2916 print $OUT "Use `q' to quit or `R' to restart. `h q' for details.\n"
2920 $finished = 1 if $inhibit_exit; # So that some keys may be disabled.
2921 $fall_off_end = 1 unless $inhibit_exit;
2922 # Do not stop in at_exit() and destructors on exit:
2923 $DB::single = !$fall_off_end && !$runnonstop;
2924 DB::fake::at_exit() unless $fall_off_end or $runnonstop;
2930 "Debugged program terminated. Use `q' to quit or `R' to restart.";
2933 package DB; # Do not trace this 1; below!