3 # Debugger for Perl 5.00x; perl5db.pl patch level:
5 $header = "perl5db.pl version $VERSION";
7 # It is crucial that there is no lexicals in scope of `eval ""' down below
9 # 'my' would make it visible from user code
10 # but so does local! --tchrist [... into @DB::res, not @res. IZ]
13 local $otrace = $trace;
14 local $osingle = $single;
16 { ($evalarg) = $evalarg =~ /(.*)/s; }
17 @res = eval "$usercontext $evalarg;\n"; # '\n' for nice recursive debug
23 local $saved[0]; # Preserve the old value of $@
28 } elsif ($onetimeDump) {
29 if ($onetimeDump eq 'dump') {
30 local $option{dumpDepth} = $onetimedumpDepth
31 if defined $onetimedumpDepth;
33 } elsif ($onetimeDump eq 'methods') {
40 # After this point it is safe to introduce lexicals
41 # However, one should not overdo it: leave as much control from outside as possible
43 # This file is automatically included if you do perl -d.
44 # It's probably not useful to include this yourself.
46 # Before venturing further into these twisty passages, it is
47 # wise to read the perldebguts man page or risk the ire of dragons.
49 # Perl supplies the values for %sub. It effectively inserts
50 # a &DB::DB(); in front of every place that can have a
51 # breakpoint. Instead of a subroutine call it calls &DB::sub with
52 # $DB::sub being the called subroutine. It also inserts a BEGIN
53 # {require 'perl5db.pl'} before the first line.
55 # After each `require'd file is compiled, but before it is executed, a
56 # call to DB::postponed($main::{'_<'.$filename}) is emulated. Here the
57 # $filename is the expanded name of the `require'd file (as found as
60 # Additional services from Perl interpreter:
62 # if caller() is called from the package DB, it provides some
65 # The array @{$main::{'_<'.$filename}} (herein called @dbline) is the
66 # line-by-line contents of $filename.
68 # The hash %{'_<'.$filename} (herein called %dbline) contains
69 # breakpoints and action (it is keyed by line number), and individual
70 # entries are settable (as opposed to the whole hash). Only true/false
71 # is important to the interpreter, though the values used by
72 # perl5db.pl have the form "$break_condition\0$action". Values are
73 # magical in numeric context.
75 # The scalar ${'_<'.$filename} contains $filename.
77 # Note that no subroutine call is possible until &DB::sub is defined
78 # (for subroutines defined outside of the package DB). In fact the same is
79 # true if $deep is not defined.
84 # At start reads $rcfile that may set important options. This file
85 # may define a subroutine &afterinit that will be executed after the
86 # debugger is initialized.
88 # After $rcfile is read reads environment variable PERLDB_OPTS and parses
89 # it as a rest of `O ...' line in debugger prompt.
91 # The options that can be specified only at startup:
92 # [To set in $rcfile, call &parse_options("optionName=new_value").]
94 # TTY - the TTY to use for debugging i/o.
96 # noTTY - if set, goes in NonStop mode. On interrupt if TTY is not set
97 # uses the value of noTTY or "/tmp/perldbtty$$" to find TTY using
98 # Term::Rendezvous. Current variant is to have the name of TTY in this
101 # ReadLine - If false, dummy ReadLine is used, so you can debug
102 # ReadLine applications.
104 # NonStop - if true, no i/o is performed until interrupt.
106 # LineInfo - file or pipe to print line number info to. If it is a
107 # pipe, a short "emacs like" message is used.
109 # RemotePort - host:port to connect to on remote host for remote debugging.
111 # Example $rcfile: (delete leading hashes!)
113 # &parse_options("NonStop=1 LineInfo=db.out");
114 # sub afterinit { $trace = 1; }
116 # The script will run without human intervention, putting trace
117 # information into db.out. (If you interrupt it, you would better
118 # reset LineInfo to something "interactive"!)
120 ##################################################################
122 # Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich)
124 # modified Perl debugger, to be run from Emacs in perldb-mode
125 # Ray Lischner (uunet!mntgfx!lisch) as of 5 Nov 1990
126 # Johan Vromans -- upgrade to 4.0 pl 10
127 # Ilya Zakharevich -- patches after 5.001 (and some before ;-)
131 # A lot of things changed after 0.94. First of all, core now informs
132 # debugger about entry into XSUBs, overloaded operators, tied operations,
133 # BEGIN and END. Handy with `O f=2'.
135 # This can make debugger a little bit too verbose, please be patient
136 # and report your problems promptly.
138 # Now the option frame has 3 values: 0,1,2.
140 # Note that if DESTROY returns a reference to the object (or object),
141 # the deletion of data may be postponed until the next function call,
142 # due to the need to examine the return value.
144 # Changes: 0.95: `v' command shows versions.
145 # Changes: 0.96: `v' command shows version of readline.
146 # primitive completion works (dynamic variables, subs for `b' and `l',
147 # options). Can `p %var'
148 # Better help (`h <' now works). New commands <<, >>, {, {{.
149 # {dump|print}_trace() coded (to be able to do it from <<cmd).
150 # `c sub' documented.
151 # At last enough magic combined to stop after the end of debuggee.
152 # !! should work now (thanks to Emacs bracket matching an extra
153 # `]' in a regexp is caught).
154 # `L', `D' and `A' span files now (as documented).
155 # Breakpoints in `require'd code are possible (used in `R').
156 # Some additional words on internal work of debugger.
157 # `b load filename' implemented.
158 # `b postpone subr' implemented.
159 # now only `q' exits debugger (overwritable on $inhibit_exit).
160 # When restarting debugger breakpoints/actions persist.
161 # Buglet: When restarting debugger only one breakpoint/action per
162 # autoloaded function persists.
163 # Changes: 0.97: NonStop will not stop in at_exit().
164 # Option AutoTrace implemented.
165 # Trace printed differently if frames are printed too.
166 # new `inhibitExit' option.
167 # printing of a very long statement interruptible.
168 # Changes: 0.98: New command `m' for printing possible methods
169 # 'l -' is a synonym for `-'.
170 # Cosmetic bugs in printing stack trace.
171 # `frame' & 8 to print "expanded args" in stack trace.
172 # Can list/break in imported subs.
173 # new `maxTraceLen' option.
174 # frame & 4 and frame & 8 granted.
176 # nonstoppable lines do not have `:' near the line number.
177 # `b compile subname' implemented.
178 # Will not use $` any more.
179 # `-' behaves sane now.
180 # Changes: 0.99: Completion for `f', `m'.
181 # `m' will remove duplicate names instead of duplicate functions.
182 # `b load' strips trailing whitespace.
183 # completion ignores leading `|'; takes into account current package
184 # when completing a subroutine name (same for `l').
185 # Changes: 1.07: Many fixed by tchrist 13-March-2000
187 # + Added bare minimal security checks on perldb rc files, plus
188 # comments on what else is needed.
189 # + Fixed the ornaments that made "|h" completely unusable.
190 # They are not used in print_help if they will hurt. Strip pod
191 # if we're paging to less.
192 # + Fixed mis-formatting of help messages caused by ornaments
193 # to restore Larry's original formatting.
194 # + Fixed many other formatting errors. The code is still suboptimal,
195 # and needs a lot of work at restructuring. It's also misindented
197 # + Fixed bug where trying to look at an option like your pager
199 # + Fixed some $? processing. Note: if you use csh or tcsh, you will
200 # lose. You should consider shell escapes not using their shell,
201 # or else not caring about detailed status. This should really be
202 # unified into one place, too.
203 # + Fixed bug where invisible trailing whitespace on commands hoses you,
204 # tricking Perl into thinking you weren't calling a debugger command!
205 # + Fixed bug where leading whitespace on commands hoses you. (One
206 # suggests a leading semicolon or any other irrelevant non-whitespace
207 # to indicate literal Perl code.)
208 # + Fixed bugs that ate warnings due to wrong selected handle.
209 # + Fixed a precedence bug on signal stuff.
210 # + Fixed some unseemly wording.
211 # + Fixed bug in help command trying to call perl method code.
212 # + Fixed to call dumpvar from exception handler. SIGPIPE killed us.
214 # + Added some comments. This code is still nasty spaghetti.
215 # + Added message if you clear your pre/post command stacks which was
216 # very easy to do if you just typed a bare >, <, or {. (A command
217 # without an argument should *never* be a destructive action; this
218 # API is fundamentally screwed up; likewise option setting, which
219 # is equally buggered.)
220 # + Added command stack dump on argument of "?" for >, <, or {.
221 # + Added a semi-built-in doc viewer command that calls man with the
222 # proper %Config::Config path (and thus gets caching, man -k, etc),
223 # or else perldoc on obstreperous platforms.
224 # + Added to and rearranged the help information.
225 # + Detected apparent misuse of { ... } to declare a block; this used
226 # to work but now is a command, and mysteriously gave no complaint.
228 # Changes: 1.08: Apr 25, 2001 Jon Eveland <jweveland@yahoo.com>
230 # + This patch to perl5db.pl cleans up formatting issues on the help
231 # summary (h h) screen in the debugger. Mostly columnar alignment
232 # issues, plus converted the printed text to use all spaces, since
233 # tabs don't seem to help much here.
235 # Changes: 1.09: May 19, 2001 Ilya Zakharevich <ilya@math.ohio-state.edu>
236 # 0) Minor bugs corrected;
237 # a) Support for auto-creation of new TTY window on startup, either
238 # unconditionally, or if started as a kid of another debugger session;
239 # b) New `O'ption CreateTTY
240 # I<CreateTTY> bits control attempts to create a new TTY on events:
241 # 1: on fork() 2: debugger is started inside debugger
243 # c) Code to auto-create a new TTY window on OS/2 (currently one
244 # extra window per session - need named pipes to have more...);
245 # d) Simplified interface for custom createTTY functions (with a backward
246 # compatibility hack); now returns the TTY name to use; return of ''
247 # means that the function reset the I/O handles itself;
248 # d') Better message on the semantic of custom createTTY function;
249 # e) Convert the existing code to create a TTY into a custom createTTY
251 # f) Consistent support for TTY names of the form "TTYin,TTYout";
252 # g) Switch line-tracing output too to the created TTY window;
253 # h) make `b fork' DWIM with CORE::GLOBAL::fork;
254 # i) High-level debugger API cmd_*():
255 # cmd_b_load($filenamepart) # b load filenamepart
256 # cmd_b_line($lineno [, $cond]) # b lineno [cond]
257 # cmd_b_sub($sub [, $cond]) # b sub [cond]
258 # cmd_stop() # Control-C
259 # cmd_d($lineno) # d lineno (B)
260 # The cmd_*() API returns FALSE on failure; in this case it outputs
261 # the error message to the debugging output.
262 # j) Low-level debugger API
263 # break_on_load($filename) # b load filename
264 # @files = report_break_on_load() # List files with load-breakpoints
265 # breakable_line_in_filename($name, $from [, $to])
266 # # First breakable line in the
267 # # range $from .. $to. $to defaults
268 # # to $from, and may be less than $to
269 # breakable_line($from [, $to]) # Same for the current file
270 # break_on_filename_line($name, $lineno [, $cond])
271 # # Set breakpoint,$cond defaults to 1
272 # break_on_filename_line_range($name, $from, $to [, $cond])
273 # # As above, on the first
274 # # breakable line in range
275 # break_on_line($lineno [, $cond]) # As above, in the current file
276 # break_subroutine($sub [, $cond]) # break on the first breakable line
277 # ($name, $from, $to) = subroutine_filename_lines($sub)
278 # # The range of lines of the text
279 # The low-level API returns TRUE on success, and die()s on failure.
281 # Changes: 1.10: May 23, 2001 Daniel Lewart <d-lewart@uiuc.edu>
283 # + Fixed warnings generated by "perl -dWe 42"
284 # + Corrected spelling errors
285 # + Squeezed Help (h) output into 80 columns
287 # Changes: 1.11: May 24, 2001 David Dyck <dcd@tc.fluke.com>
288 # + Made "x @INC" work like it used to
290 # Changes: 1.12: May 24, 2001 Daniel Lewart <d-lewart@uiuc.edu>
291 # + Fixed warnings generated by "O" (Show debugger options)
292 # + Fixed warnings generated by "p 42" (Print expression)
293 # Changes: 1.13: Jun 19, 2001 Scott.L.Miller@compaq.com
294 # + Added windowSize option
295 # Changes: 1.14: Oct 9, 2001 multiple
296 # + Clean up after itself on VMS (Charles Lane in 12385)
297 # + Adding "@ file" syntax (Peter Scott in 12014)
298 # + Debug reloading selfloaded stuff (Ilya Zakharevich in 11457)
299 # + $^S and other debugger fixes (Ilya Zakharevich in 11120)
300 # + Forgot a my() declaration (Ilya Zakharevich in 11085)
301 # Changes: 1.15: Nov 6, 2001 Michael G Schwern <schwern@pobox.com>
302 # + Updated 1.14 change log
303 # + Added *dbline explainatory comments
304 # + Mentioning perldebguts man page
305 # Changes: 1.16: Feb 15, 2002 Mark-Jason Dominus <mjd@plover.com>
306 # + $onetimeDump improvements
307 # Changes: 1.17: Feb 20, 2002 Richard Foley <richard.foley@rfi.net>
308 # Moved some code to cmd_[.]()'s for clarity and ease of handling,
309 # rationalised the following commands and added cmd_wrapper() to
310 # enable switching between old and frighteningly consistent new
311 # behaviours for diehards: 'o CommandSet=pre580' (sigh...)
312 # a(add), A(del) # action expr (added del by line)
313 # + b(add), B(del) # break [line] (was b,D)
314 # + w(add), W(del) # watch expr (was W,W) added del by expr
315 # + h(summary), h h(long) # help (hh) (was h h,h)
316 # + m(methods), M(modules) # ... (was m,v)
317 # + o(option) # lc (was O)
318 # + v(view code), V(view Variables) # ... (was w,V)
319 # Changes: 1.18: Mar 17, 2002 Richard Foley <richard.foley@rfi.net>
320 # + fixed missing cmd_O bug
321 # Changes: 1.19: Mar 29, 2002 Spider Boardman
322 # + Added missing local()s -- DB::DB is called recursively.
324 ####################################################################
326 # Needed for the statement after exec():
328 BEGIN { $ini_warn = $^W; $^W = 0 } # Switch compilation warnings off until another BEGIN.
329 local($^W) = 0; # Switch run-time warnings off during init.
332 $dumpvar::arrayDepth,
333 $dumpvar::dumpDBFiles,
334 $dumpvar::dumpPackages,
335 $dumpvar::quoteHighBit,
336 $dumpvar::printUndef,
345 # Command-line + PERLLIB:
348 # $prevwarn = $prevdie = $prevbus = $prevsegv = ''; # Does not help?!
350 $trace = $signal = $single = 0; # Uninitialized warning suppression
351 # (local $^W cannot help - other packages!).
352 $inhibit_exit = $option{PrintRet} = 1;
354 @options = qw(hashDepth arrayDepth CommandSet dumpDepth
355 DumpDBFiles DumpPackages DumpReused
356 compactDump veryCompact quote HighBit undefPrint
357 globPrint PrintRet UsageOnly frame AutoTrace
358 TTY noTTY ReadLine NonStop LineInfo maxTraceLen
359 recallCommand ShellBang pager tkRunning ornaments
360 signalLevel warnLevel dieLevel inhibit_exit
361 ImmediateStop bareStringify CreateTTY
362 RemotePort windowSize);
365 hashDepth => \$dumpvar::hashDepth,
366 arrayDepth => \$dumpvar::arrayDepth,
367 CommandSet => \$CommandSet,
368 DumpDBFiles => \$dumpvar::dumpDBFiles,
369 DumpPackages => \$dumpvar::dumpPackages,
370 DumpReused => \$dumpvar::dumpReused,
371 HighBit => \$dumpvar::quoteHighBit,
372 undefPrint => \$dumpvar::printUndef,
373 globPrint => \$dumpvar::globPrint,
374 UsageOnly => \$dumpvar::usageOnly,
375 CreateTTY => \$CreateTTY,
376 bareStringify => \$dumpvar::bareStringify,
378 AutoTrace => \$trace,
379 inhibit_exit => \$inhibit_exit,
380 maxTraceLen => \$maxtrace,
381 ImmediateStop => \$ImmediateStop,
382 RemotePort => \$remoteport,
383 windowSize => \$window,
387 compactDump => \&dumpvar::compactDump,
388 veryCompact => \&dumpvar::veryCompact,
389 quote => \&dumpvar::quote,
392 ReadLine => \&ReadLine,
393 NonStop => \&NonStop,
394 LineInfo => \&LineInfo,
395 recallCommand => \&recallCommand,
396 ShellBang => \&shellBang,
398 signalLevel => \&signalLevel,
399 warnLevel => \&warnLevel,
400 dieLevel => \&dieLevel,
401 tkRunning => \&tkRunning,
402 ornaments => \&ornaments,
403 RemotePort => \&RemotePort,
407 compactDump => 'dumpvar.pl',
408 veryCompact => 'dumpvar.pl',
409 quote => 'dumpvar.pl',
412 # These guys may be defined in $ENV{PERL5DB} :
413 $rl = 1 unless defined $rl;
414 $warnLevel = 1 unless defined $warnLevel;
415 $dieLevel = 1 unless defined $dieLevel;
416 $signalLevel = 1 unless defined $signalLevel;
417 $pre = [] unless defined $pre;
418 $post = [] unless defined $post;
419 $pretype = [] unless defined $pretype;
420 $CreateTTY = 3 unless defined $CreateTTY;
421 $CommandSet = '580' unless defined $CommandSet;
423 warnLevel($warnLevel);
425 signalLevel($signalLevel);
428 defined $ENV{PAGER} ? $ENV{PAGER} :
429 eval { require Config } &&
430 defined $Config::Config{pager} ? $Config::Config{pager}
432 ) unless defined $pager;
434 &recallCommand("!") unless defined $prc;
435 &shellBang("!") unless defined $psh;
437 $maxtrace = 400 unless defined $maxtrace;
438 $ini_pids = $ENV{PERLDB_PIDS};
439 if (defined $ENV{PERLDB_PIDS}) {
440 $pids = "[$ENV{PERLDB_PIDS}]";
441 $ENV{PERLDB_PIDS} .= "->$$";
444 $ENV{PERLDB_PIDS} = "$$";
449 *emacs = $slave_editor if $slave_editor; # May be used in afterinit()...
451 if (-e "/dev/tty") { # this is the wrong metric!
454 $rcfile="perldb.ini";
457 # This isn't really safe, because there's a race
458 # between checking and opening. The solution is to
459 # open and fstat the handle, but then you have to read and
460 # eval the contents. But then the silly thing gets
461 # your lexical scope, which is unfortunately at best.
465 # Just exactly what part of the word "CORE::" don't you understand?
466 local $SIG{__WARN__};
469 unless (is_safe_file($file)) {
470 CORE::warn <<EO_GRIPE;
471 perldb: Must not source insecure rcfile $file.
472 You or the superuser must be the owner, and it must not
473 be writable by anyone but its owner.
479 CORE::warn("perldb: couldn't parse $file: $@") if $@;
483 # Verifies that owner is either real user or superuser and that no
484 # one but owner may write to it. This function is of limited use
485 # when called on a path instead of upon a handle, because there are
486 # no guarantees that filename (by dirent) whose file (by ino) is
487 # eventually accessed is the same as the one tested.
488 # Assumes that the file's existence is not in doubt.
491 stat($path) || return; # mysteriously vaporized
492 my($dev,$ino,$mode,$nlink,$uid,$gid) = stat(_);
494 return 0 if $uid != 0 && $uid != $<;
495 return 0 if $mode & 022;
500 safe_do("./$rcfile");
502 elsif (defined $ENV{HOME} && -f "$ENV{HOME}/$rcfile") {
503 safe_do("$ENV{HOME}/$rcfile");
505 elsif (defined $ENV{LOGDIR} && -f "$ENV{LOGDIR}/$rcfile") {
506 safe_do("$ENV{LOGDIR}/$rcfile");
509 if (defined $ENV{PERLDB_OPTS}) {
510 parse_options($ENV{PERLDB_OPTS});
513 if ( not defined &get_fork_TTY and defined $ENV{TERM} and $ENV{TERM} eq 'xterm'
514 and defined $ENV{WINDOWID} and defined $ENV{DISPLAY} ) { # _inside_ XTERM?
515 *get_fork_TTY = \&xterm_get_fork_TTY;
516 } elsif ($^O eq 'os2') {
517 *get_fork_TTY = \&os2_get_fork_TTY;
520 # Here begin the unreadable code. It needs fixing.
522 if (exists $ENV{PERLDB_RESTART}) {
523 delete $ENV{PERLDB_RESTART};
525 @hist = get_list('PERLDB_HIST');
526 %break_on_load = get_list("PERLDB_ON_LOAD");
527 %postponed = get_list("PERLDB_POSTPONE");
528 my @had_breakpoints= get_list("PERLDB_VISITED");
529 for (0 .. $#had_breakpoints) {
530 my %pf = get_list("PERLDB_FILE_$_");
531 $postponed_file{$had_breakpoints[$_]} = \%pf if %pf;
533 my %opt = get_list("PERLDB_OPT");
535 while (($opt,$val) = each %opt) {
536 $val =~ s/[\\\']/\\$1/g;
537 parse_options("$opt'$val'");
539 @INC = get_list("PERLDB_INC");
541 $pretype = [get_list("PERLDB_PRETYPE")];
542 $pre = [get_list("PERLDB_PRE")];
543 $post = [get_list("PERLDB_POST")];
544 @typeahead = get_list("PERLDB_TYPEAHEAD", @typeahead);
550 # Is Perl being run from a slave editor or graphical debugger?
551 $slave_editor = ((defined $main::ARGV[0]) and ($main::ARGV[0] eq '-emacs'));
552 $rl = 0, shift(@main::ARGV) if $slave_editor;
554 #require Term::ReadLine;
556 if ($^O eq 'cygwin') {
557 # /dev/tty is binary. use stdin for textmode
559 } elsif (-e "/dev/tty") {
560 $console = "/dev/tty";
561 } elsif ($^O eq 'dos' or -e "con" or $^O eq 'MSWin32') {
563 } elsif ($^O eq 'MacOS') {
564 if ($MacPerl::Version !~ /MPW/) {
565 $console = "Dev:Console:Perl Debug"; # Separate window for application
567 $console = "Dev:Console";
570 $console = "sys\$command";
573 if (($^O eq 'MSWin32') and ($slave_editor or defined $ENV{EMACS})) {
577 if ($^O eq 'NetWare') {
582 if (defined $ENV{OS2_SHELL} and ($slave_editor or $ENV{WINDOWID})) { # In OS/2
590 $console = $tty if defined $tty;
592 if (defined $remoteport) {
594 $OUT = new IO::Socket::INET( Timeout => '10',
595 PeerAddr => $remoteport,
598 if (!$OUT) { die "Unable to connect to remote host: $remoteport\n"; }
601 create_IN_OUT(4) if $CreateTTY & 4;
603 my ($i, $o) = split /,/, $console;
604 $o = $i unless defined $o;
605 open(IN,"+<$i") || open(IN,"<$i") || open(IN,"<&STDIN");
606 open(OUT,"+>$o") || open(OUT,">$o") || open(OUT,">&STDERR")
607 || open(OUT,">&STDOUT"); # so we don't dongle stdout
608 } elsif (not defined $console) {
610 open(OUT,">&STDERR") || open(OUT,">&STDOUT"); # so we don't dongle stdout
611 $console = 'STDIN/OUT';
613 # so open("|more") can read from STDOUT and so we don't dingle stdin
614 $IN = \*IN, $OUT = \*OUT if $console or not defined $console;
616 my $previous = select($OUT);
617 $| = 1; # for DB::OUT
620 $LINEINFO = $OUT unless defined $LINEINFO;
621 $lineinfo = $console unless defined $lineinfo;
623 $header =~ s/.Header: ([^,]+),v(\s+\S+\s+\S+).*$/$1$2/;
624 unless ($runnonstop) {
627 if ($term_pid eq '-1') {
628 print $OUT "\nDaughter DB session started...\n";
630 print $OUT "\nLoading DB routines from $header\n";
631 print $OUT ("Editor support ",
632 $slave_editor ? "enabled" : "available",
634 print $OUT "\nEnter h or `h h' for help, or `$doccmd perldebug' for more help.\n\n";
642 s/(.*)/'$1'/ unless /^-?[\d.]+$/;
645 if (defined &afterinit) { # May be defined in $rcfile
651 ############################################################ Subroutines
654 # _After_ the perl program is compiled, $single is set to 1:
655 if ($single and not $second_time++) {
656 if ($runnonstop) { # Disable until signal
657 for ($i=0; $i <= $stack_depth; ) {
661 # return; # Would not print trace!
662 } elsif ($ImmediateStop) {
667 $runnonstop = 0 if $single or $signal; # Disable it if interactive.
669 local($package, $filename, $line) = caller;
670 local $filename_ini = $filename;
671 local $usercontext = '($@, $!, $^E, $,, $/, $\, $^W) = @saved;' .
672 "package $package;"; # this won't let them modify, alas
673 local(*dbline) = $main::{'_<' . $filename};
675 # we need to check for pseudofiles on Mac OS (these are files
676 # not attached to a filename, but instead stored in Dev:Pseudo)
677 if ($^O eq 'MacOS' && $#dbline < 0) {
678 $filename_ini = $filename = 'Dev:Pseudo';
679 *dbline = $main::{'_<' . $filename};
682 local $max = $#dbline;
683 if ($dbline{$line} && (($stop,$action) = split(/\0/,$dbline{$line}))) {
687 $evalarg = "\$DB::signal |= 1 if do {$stop}"; &eval;
688 $dbline{$line} =~ s/;9($|\0)/$1/;
691 my $was_signal = $signal;
693 for (my $n = 0; $n <= $#to_watch; $n++) {
694 $evalarg = $to_watch[$n];
695 local $onetimeDump; # Do not output results
696 my ($val) = &eval; # Fix context (&eval is doing array)?
697 $val = ( (defined $val) ? "'$val'" : 'undef' );
698 if ($val ne $old_watch[$n]) {
701 Watchpoint $n:\t$to_watch[$n] changed:
702 old value:\t$old_watch[$n]
705 $old_watch[$n] = $val;
709 if ($trace & 4) { # User-installed watch
710 return if watchfunction($package, $filename, $line)
711 and not $single and not $was_signal and not ($trace & ~4);
713 $was_signal = $signal;
715 if ($single || ($trace & 1) || $was_signal) {
717 $position = "\032\032$filename:$line:0\n";
718 print_lineinfo($position);
719 } elsif ($package eq 'DB::fake') {
722 Debugged program terminated. Use B<q> to quit or B<R> to restart,
723 use B<O> I<inhibit_exit> to avoid stopping after program termination,
724 B<h q>, B<h R> or B<h O> to get additional info.
727 $usercontext = '($@, $!, $^E, $,, $/, $\, $^W) = @saved;' .
728 "package $package;"; # this won't let them modify, alas
731 $prefix = $sub =~ /::/ ? "" : "${'package'}::";
732 $prefix .= "$sub($filename:";
733 $after = ($dbline[$line] =~ /\n$/ ? '' : "\n");
734 if (length($prefix) > 30) {
735 $position = "$prefix$line):\n$line:\t$dbline[$line]$after";
740 $position = "$prefix$line$infix$dbline[$line]$after";
743 print_lineinfo(' ' x $stack_depth, "$line:\t$dbline[$line]$after");
745 print_lineinfo($position);
747 for ($i = $line + 1; $i <= $max && $dbline[$i] == 0; ++$i) { #{ vi
748 last if $dbline[$i] =~ /^\s*[\;\}\#\n]/;
750 $after = ($dbline[$i] =~ /\n$/ ? '' : "\n");
751 $incr_pos = "$prefix$i$infix$dbline[$i]$after";
752 $position .= $incr_pos;
754 print_lineinfo(' ' x $stack_depth, "$i:\t$dbline[$i]$after");
756 print_lineinfo($incr_pos);
761 $evalarg = $action, &eval if $action;
762 if ($single || $was_signal) {
763 local $level = $level + 1;
764 foreach $evalarg (@$pre) {
767 print $OUT $stack_depth . " levels deep in subroutine calls!\n"
770 $incr = -1; # for backward motion.
771 @typeahead = (@$pretype, @typeahead);
773 while (($term || &setterm),
774 ($term_pid == $$ or resetterm(1)),
775 defined ($cmd=&readline("$pidprompt DB" . ('<' x $level) .
776 ($#hist+1) . ('>' x $level) . " ")))
780 $cmd =~ s/\\$/\n/ && do {
781 $cmd .= &readline(" cont: ");
784 $cmd =~ /^$/ && ($cmd = $laststep);
785 push(@hist,$cmd) if length($cmd) > 1;
787 $cmd =~ s/^\s+//s; # trim annoying leading whitespace
788 $cmd =~ s/\s+$//s; # trim annoying trailing whitespace
789 ($i) = split(/\s+/,$cmd);
791 # squelch the sigmangler
793 local $SIG{__WARN__};
794 eval "\$cmd =~ $alias{$i}";
797 print $OUT "Couldn't evaluate `$i' alias: $@";
801 $cmd =~ /^q$/ && do {
806 $cmd =~ /^t$/ && do {
809 print $OUT "Trace = " .
810 (($trace & 1) ? "on" : "off" ) . "\n";
812 $cmd =~ /^S(\s+(!)?(.+))?$/ && do {
813 $Srev = defined $2; $Spatt = $3; $Snocheck = ! defined $1;
816 foreach $subname (sort(keys %sub)) {
817 if ($Snocheck or $Srev^($subname =~ /$Spatt/)) {
818 print $OUT $subname,"\n";
822 $cmd =~ s/^X\b/V $package/;
823 $cmd =~ /^V$/ && do {
824 $cmd = "V $package"; };
825 $cmd =~ /^V\b\s*(\S+)\s*(.*)/ && do {
826 local ($savout) = select($OUT);
828 @vars = split(' ',$2);
829 do 'dumpvar.pl' unless defined &main::dumpvar;
830 if (defined &main::dumpvar) {
833 # must detect sigpipe failures
834 eval { &main::dumpvar($packname,
835 defined $option{dumpDepth}
836 ? $option{dumpDepth} : -1,
839 die unless $@ =~ /dumpvar print failed/;
842 print $OUT "dumpvar.pl not available.\n";
846 $cmd =~ s/^x\b/ / && do { # So that will be evaled
847 $onetimeDump = 'dump';
848 # handle special "x 3 blah" syntax
849 if ($cmd =~ s/^\s*(\d+)(?=\s)/ /) {
850 $onetimedumpDepth = $1;
853 $cmd =~ s/^m\s+([\w:]+)\s*$/ / && do {
854 methods($1); next CMD};
855 $cmd =~ s/^m\b/ / && do { # So this will be evaled
856 $onetimeDump = 'methods'; };
857 $cmd =~ /^f\b\s*(.*)/ && do {
861 print $OUT "The old f command is now the r command.\n"; # hint
862 print $OUT "The new f command switches filenames.\n";
865 if (!defined $main::{'_<' . $file}) {
866 if (($try) = grep(m#^_<.*$file#, keys %main::)) {{
867 $try = substr($try,2);
868 print $OUT "Choosing $try matching `$file':\n";
872 if (!defined $main::{'_<' . $file}) {
873 print $OUT "No file matching `$file' is loaded.\n";
875 } elsif ($file ne $filename) {
876 *dbline = $main::{'_<' . $file};
882 print $OUT "Already in $file.\n";
886 $cmd =~ /^\.$/ && do {
887 $incr = -1; # for backward motion.
889 $filename = $filename_ini;
890 *dbline = $main::{'_<' . $filename};
892 print_lineinfo($position);
894 $cmd =~ /^-$/ && do {
895 $start -= $incr + $window + 1;
896 $start = 1 if $start <= 0;
898 $cmd = 'l ' . ($start) . '+'; };
900 $cmd =~ /^([aAbBhlLMoOvwW])\b\s*(.*)/s && do {
901 &cmd_wrapper($1, $2, $line);
905 $cmd =~ /^\<\<\s*(.*)/ && do { # \<\< for CPerl sake: not HERE
906 push @$pre, action($1);
908 $cmd =~ /^>>\s*(.*)/ && do {
909 push @$post, action($1);
911 $cmd =~ /^<\s*(.*)/ && do {
913 print $OUT "All < actions cleared.\n";
919 print $OUT "No pre-prompt Perl actions.\n";
922 print $OUT "Perl commands run before each prompt:\n";
923 for my $action ( @$pre ) {
924 print $OUT "\t< -- $action\n";
930 $cmd =~ /^>\s*(.*)/ && do {
932 print $OUT "All > actions cleared.\n";
938 print $OUT "No post-prompt Perl actions.\n";
941 print $OUT "Perl commands run after each prompt:\n";
942 for my $action ( @$post ) {
943 print $OUT "\t> -- $action\n";
947 $post = [action($1)];
949 $cmd =~ /^\{\{\s*(.*)/ && do {
950 if ($cmd =~ /^\{.*\}$/ && unbalanced(substr($cmd,2))) {
951 print $OUT "{{ is now a debugger command\n",
952 "use `;{{' if you mean Perl code\n";
958 $cmd =~ /^\{\s*(.*)/ && do {
960 print $OUT "All { actions cleared.\n";
966 print $OUT "No pre-prompt debugger actions.\n";
969 print $OUT "Debugger commands run before each prompt:\n";
970 for my $action ( @$pretype ) {
971 print $OUT "\t{ -- $action\n";
975 if ($cmd =~ /^\{.*\}$/ && unbalanced(substr($cmd,1))) {
976 print $OUT "{ is now a debugger command\n",
977 "use `;{' if you mean Perl code\n";
983 $cmd =~ /^y(?:\s+(\d*)\s*(.*))?$/ && do {
984 eval { require PadWalker; PadWalker->VERSION(0.08) }
985 or &warn($@ =~ /locate/
986 ? "PadWalker module not found - please install\n"
989 do 'dumpvar.pl' unless defined &main::dumpvar;
990 defined &main::dumpvar
991 or print $OUT "dumpvar.pl not available.\n"
993 my @vars = split(' ', $2 || '');
994 my $h = eval { PadWalker::peek_my(($1 || 0) + 1) };
995 $@ and $@ =~ s/ at .*//, &warn($@), next CMD;
996 my $savout = select($OUT);
997 dumpvar::dumplex($_, $h->{$_},
998 defined $option{dumpDepth}
999 ? $option{dumpDepth} : -1,
1004 $cmd =~ /^n$/ && do {
1005 end_report(), next CMD if $finished and $level <= 1;
1009 $cmd =~ /^s$/ && do {
1010 end_report(), next CMD if $finished and $level <= 1;
1014 $cmd =~ /^c\b\s*([\w:]*)\s*$/ && do {
1015 end_report(), next CMD if $finished and $level <= 1;
1017 # Probably not needed, since we finish an interactive
1018 # sub-session anyway...
1019 # local $filename = $filename;
1020 # local *dbline = *dbline; # XXX Would this work?!
1021 if ($subname =~ /\D/) { # subroutine name
1022 $subname = $package."::".$subname
1023 unless $subname =~ /::/;
1024 ($file,$i) = (find_sub($subname) =~ /^(.*):(.*)$/);
1028 *dbline = $main::{'_<' . $filename};
1029 $had_breakpoints{$filename} |= 1;
1031 ++$i while $dbline[$i] == 0 && $i < $max;
1033 print $OUT "Subroutine $subname not found.\n";
1038 if ($dbline[$i] == 0) {
1039 print $OUT "Line $i not breakable.\n";
1042 $dbline{$i} =~ s/($|\0)/;9$1/; # add one-time-only b.p.
1044 for ($i=0; $i <= $stack_depth; ) {
1048 $cmd =~ /^r$/ && do {
1049 end_report(), next CMD if $finished and $level <= 1;
1050 $stack[$stack_depth] |= 1;
1051 $doret = $option{PrintRet} ? $stack_depth - 1 : -2;
1053 $cmd =~ /^R$/ && do {
1054 print $OUT "Warning: some settings and command-line options may be lost!\n";
1055 my (@script, @flags, $cl);
1056 push @flags, '-w' if $ini_warn;
1057 # Put all the old includes at the start to get
1058 # the same debugger.
1060 push @flags, '-I', $_;
1062 push @flags, '-T' if ${^TAINT};
1063 # Arrange for setting the old INC:
1064 set_list("PERLDB_INC", @ini_INC);
1066 for (1..$#{'::_<-e'}) { # The first line is PERL5DB
1067 chomp ($cl = ${'::_<-e'}[$_]);
1068 push @script, '-e', $cl;
1073 set_list("PERLDB_HIST",
1074 $term->Features->{getHistory}
1075 ? $term->GetHistory : @hist);
1076 my @had_breakpoints = keys %had_breakpoints;
1077 set_list("PERLDB_VISITED", @had_breakpoints);
1078 set_list("PERLDB_OPT", %option);
1079 set_list("PERLDB_ON_LOAD", %break_on_load);
1081 for (0 .. $#had_breakpoints) {
1082 my $file = $had_breakpoints[$_];
1083 *dbline = $main::{'_<' . $file};
1084 next unless %dbline or $postponed_file{$file};
1085 (push @hard, $file), next
1086 if $file =~ /^\(\w*eval/;
1088 @add = %{$postponed_file{$file}}
1089 if $postponed_file{$file};
1090 set_list("PERLDB_FILE_$_", %dbline, @add);
1092 for (@hard) { # Yes, really-really...
1093 # Find the subroutines in this eval
1094 *dbline = $main::{'_<' . $_};
1095 my ($quoted, $sub, %subs, $line) = quotemeta $_;
1096 for $sub (keys %sub) {
1097 next unless $sub{$sub} =~ /^$quoted:(\d+)-(\d+)$/;
1098 $subs{$sub} = [$1, $2];
1102 "No subroutines in $_, ignoring breakpoints.\n";
1105 LINES: for $line (keys %dbline) {
1106 # One breakpoint per sub only:
1107 my ($offset, $sub, $found);
1108 SUBS: for $sub (keys %subs) {
1109 if ($subs{$sub}->[1] >= $line # Not after the subroutine
1110 and (not defined $offset # Not caught
1111 or $offset < 0 )) { # or badly caught
1113 $offset = $line - $subs{$sub}->[0];
1114 $offset = "+$offset", last SUBS if $offset >= 0;
1117 if (defined $offset) {
1118 $postponed{$found} =
1119 "break $offset if $dbline{$line}";
1121 print $OUT "Breakpoint in $_:$line ignored: after all the subroutines.\n";
1125 set_list("PERLDB_POSTPONE", %postponed);
1126 set_list("PERLDB_PRETYPE", @$pretype);
1127 set_list("PERLDB_PRE", @$pre);
1128 set_list("PERLDB_POST", @$post);
1129 set_list("PERLDB_TYPEAHEAD", @typeahead);
1130 $ENV{PERLDB_RESTART} = 1;
1131 delete $ENV{PERLDB_PIDS}; # Restore ini state
1132 $ENV{PERLDB_PIDS} = $ini_pids if defined $ini_pids;
1133 #print "$^X, '-d', @flags, @script, ($slave_editor ? '-emacs' : ()), @ARGS";
1134 exec($^X, '-d', @flags, @script, ($slave_editor ? '-emacs' : ()), @ARGS) ||
1135 print $OUT "exec failed: $!\n";
1137 $cmd =~ /^T$/ && do {
1138 print_trace($OUT, 1); # skip DB
1140 $cmd =~ /^w\b\s*(.*)/s && do { &cmd_w($1); next CMD; };
1141 $cmd =~ /^W\b\s*(.*)/s && do { &cmd_W($1); next CMD; };
1142 $cmd =~ /^\/(.*)$/ && do {
1144 $inpat =~ s:([^\\])/$:$1:;
1146 # squelch the sigmangler
1147 local $SIG{__DIE__};
1148 local $SIG{__WARN__};
1149 eval '$inpat =~ m'."\a$inpat\a";
1161 $start = 1 if ($start > $max);
1162 last if ($start == $end);
1163 if ($dbline[$start] =~ m' . "\a$pat\a" . 'i) {
1164 if ($slave_editor) {
1165 print $OUT "\032\032$filename:$start:0\n";
1167 print $OUT "$start:\t", $dbline[$start], "\n";
1172 print $OUT "/$pat/: not found\n" if ($start == $end);
1174 $cmd =~ /^\?(.*)$/ && do {
1176 $inpat =~ s:([^\\])\?$:$1:;
1178 # squelch the sigmangler
1179 local $SIG{__DIE__};
1180 local $SIG{__WARN__};
1181 eval '$inpat =~ m'."\a$inpat\a";
1193 $start = $max if ($start <= 0);
1194 last if ($start == $end);
1195 if ($dbline[$start] =~ m' . "\a$pat\a" . 'i) {
1196 if ($slave_editor) {
1197 print $OUT "\032\032$filename:$start:0\n";
1199 print $OUT "$start:\t", $dbline[$start], "\n";
1204 print $OUT "?$pat?: not found\n" if ($start == $end);
1206 $cmd =~ /^$rc+\s*(-)?(\d+)?$/ && do {
1207 pop(@hist) if length($cmd) > 1;
1208 $i = $1 ? ($#hist-($2||1)) : ($2||$#hist);
1210 print $OUT $cmd, "\n";
1212 $cmd =~ /^$sh$sh\s*([\x00-\xff]*)/ && do {
1215 $cmd =~ /^$rc([^$rc].*)$/ && do {
1217 pop(@hist) if length($cmd) > 1;
1218 for ($i = $#hist; $i; --$i) {
1219 last if $hist[$i] =~ /$pat/;
1222 print $OUT "No such command!\n\n";
1226 print $OUT $cmd, "\n";
1228 $cmd =~ /^$sh$/ && do {
1229 &system($ENV{SHELL}||"/bin/sh");
1231 $cmd =~ /^$sh\s*([\x00-\xff]*)/ && do {
1232 # XXX: using csh or tcsh destroys sigint retvals!
1233 #&system($1); # use this instead
1234 &system($ENV{SHELL}||"/bin/sh","-c",$1);
1236 $cmd =~ /^H\b\s*(-(\d+))?/ && do {
1237 $end = $2 ? ($#hist-$2) : 0;
1238 $hist = 0 if $hist < 0;
1239 for ($i=$#hist; $i>$end; $i--) {
1240 print $OUT "$i: ",$hist[$i],"\n"
1241 unless $hist[$i] =~ /^.?$/;
1244 $cmd =~ /^(?:man|(?:perl)?doc)\b(?:\s+([^(]*))?$/ && do {
1247 $cmd =~ s/^p$/print {\$DB::OUT} \$_/;
1248 $cmd =~ s/^p\b/print {\$DB::OUT} /;
1249 $cmd =~ s/^=\s*// && do {
1251 if (length $cmd == 0) {
1252 @keys = sort keys %alias;
1253 } elsif (my($k,$v) = ($cmd =~ /^(\S+)\s+(\S.*)/)) {
1254 # can't use $_ or kill //g state
1255 for my $x ($k, $v) { $x =~ s/\a/\\a/g }
1256 $alias{$k} = "s\a$k\a$v\a";
1257 # squelch the sigmangler
1258 local $SIG{__DIE__};
1259 local $SIG{__WARN__};
1260 unless (eval "sub { s\a$k\a$v\a }; 1") {
1261 print $OUT "Can't alias $k to $v: $@\n";
1270 if ((my $v = $alias{$k}) =~ s
\as\a$k\a(.*)\a$
\a1
\a) {
1271 print $OUT "$k\t= $1\n";
1273 elsif (defined $alias{$k}) {
1274 print $OUT "$k\t$alias{$k}\n";
1277 print "No alias for $k\n";
1281 $cmd =~ /^source\s+(.*\S)/ && do {
1282 if (open my $fh, $1) {
1285 &warn("Can't execute `$1': $!\n");
1288 $cmd =~ /^\|\|?\s*[^|]/ && do {
1289 if ($pager =~ /^\|/) {
1290 open(SAVEOUT,">&STDOUT") || &warn("Can't save STDOUT");
1291 open(STDOUT,">&OUT") || &warn("Can't redirect STDOUT");
1293 open(SAVEOUT,">&OUT") || &warn("Can't save DB::OUT");
1296 unless ($piped=open(OUT,$pager)) {
1297 &warn("Can't pipe output to `$pager'");
1298 if ($pager =~ /^\|/) {
1299 open(OUT,">&STDOUT") # XXX: lost message
1300 || &warn("Can't restore DB::OUT");
1301 open(STDOUT,">&SAVEOUT")
1302 || &warn("Can't restore STDOUT");
1305 open(OUT,">&STDOUT") # XXX: lost message
1306 || &warn("Can't restore DB::OUT");
1310 $SIG{PIPE}= \&DB::catch if $pager =~ /^\|/
1311 && ("" eq $SIG{PIPE} || "DEFAULT" eq $SIG{PIPE});
1312 $selected= select(OUT);
1314 select( $selected ), $selected= "" unless $cmd =~ /^\|\|/;
1315 $cmd =~ s/^\|+\s*//;
1318 # XXX Local variants do not work!
1319 $cmd =~ s/^t\s/\$DB::trace |= 1;\n/;
1320 $cmd =~ s/^s\s/\$DB::single = 1;\n/ && do {$laststep = 's'};
1321 $cmd =~ s/^n\s/\$DB::single = 2;\n/ && do {$laststep = 'n'};
1323 $evalarg = "\$^D = \$^D | \$DB::db_stop;\n$cmd"; &eval;
1325 $onetimeDump = undef;
1326 $onetimedumpDepth = undef;
1327 } elsif ($term_pid == $$) {
1332 if ($pager =~ /^\|/) {
1334 # we cannot warn here: the handle is missing --tchrist
1335 close(OUT) || print SAVEOUT "\nCan't close DB::OUT\n";
1337 # most of the $? crud was coping with broken cshisms
1339 print SAVEOUT "Pager `$pager' failed: ";
1341 print SAVEOUT "shell returned -1\n";
1344 ( $? & 127 ) ? " (SIG#".($?&127).")" : "",
1345 ( $? & 128 ) ? " -- core dumped" : "", "\n";
1347 print SAVEOUT "status ", ($? >> 8), "\n";
1351 open(OUT,">&STDOUT") || &warn("Can't restore DB::OUT");
1352 open(STDOUT,">&SAVEOUT") || &warn("Can't restore STDOUT");
1353 $SIG{PIPE} = "DEFAULT" if $SIG{PIPE} eq \&DB::catch;
1354 # Will stop ignoring SIGPIPE if done like nohup(1)
1355 # does SIGINT but Perl doesn't give us a choice.
1357 open(OUT,">&SAVEOUT") || &warn("Can't restore DB::OUT");
1360 select($selected), $selected= "" unless $selected eq "";
1364 $fall_off_end = 1 unless defined $cmd; # Emulate `q' on EOF
1365 foreach $evalarg (@$post) {
1368 } # if ($single || $signal)
1369 ($@, $!, $^E, $,, $/, $\, $^W) = @saved;
1373 # The following code may be executed now:
1377 my ($al, $ret, @ret) = "";
1378 if (length($sub) > 10 && substr($sub, -10, 10) eq '::AUTOLOAD') {
1381 local $stack_depth = $stack_depth + 1; # Protect from non-local exits
1382 $#stack = $stack_depth;
1383 $stack[-1] = $single;
1385 $single |= 4 if $stack_depth == $deep;
1387 ? ( print_lineinfo(' ' x ($stack_depth - 1), "in "),
1388 # Why -1? But it works! :-(
1389 print_trace($LINEINFO, -1, 1, 1, "$sub$al") )
1390 : print_lineinfo(' ' x ($stack_depth - 1), "entering $sub$al\n")) if $frame;
1393 $single |= $stack[$stack_depth--];
1395 ? ( print_lineinfo(' ' x $stack_depth, "out "),
1396 print_trace($LINEINFO, -1, 1, 1, "$sub$al") )
1397 : print_lineinfo(' ' x $stack_depth, "exited $sub$al\n")) if $frame & 2;
1398 if ($doret eq $stack_depth or $frame & 16) {
1400 my $fh = ($doret eq $stack_depth ? $OUT : $LINEINFO);
1401 print $fh ' ' x $stack_depth if $frame & 16;
1402 print $fh "list context return from $sub:\n";
1403 dumpit($fh, \@ret );
1408 if (defined wantarray) {
1413 $single |= $stack[$stack_depth--];
1415 ? ( print_lineinfo(' ' x $stack_depth, "out "),
1416 print_trace($LINEINFO, -1, 1, 1, "$sub$al") )
1417 : print_lineinfo(' ' x $stack_depth, "exited $sub$al\n")) if $frame & 2;
1418 if ($doret eq $stack_depth or $frame & 16 and defined wantarray) {
1420 my $fh = ($doret eq $stack_depth ? $OUT : $LINEINFO);
1421 print $fh (' ' x $stack_depth) if $frame & 16;
1422 print $fh (defined wantarray
1423 ? "scalar context return from $sub: "
1424 : "void context return from $sub\n");
1425 dumpit( $fh, $ret ) if defined wantarray;
1434 ### Functions with multiple modes of failure die on error, the rest
1435 ### returns FALSE on error.
1436 ### User-interface functions cmd_* output error message.
1438 ### Note all cmd_[a-zA-Z]'s require $line, $dblineno as first arguments
1443 'A' => 'pre580_null',
1445 'B' => 'pre580_null',
1446 'd' => 'pre580_null',
1449 'M' => 'pre580_null',
1451 'o' => 'pre580_null',
1461 my $dblineno = shift;
1463 # with this level of indirection we can wrap
1464 # to old (pre580) or other command sets easily
1467 $set{$CommandSet}{$cmd} || $cmd
1469 # print "cmd_wrapper($cmd): $CommandSet($set{$CommandSet}{$cmd}) => call($call)\n";
1471 return &$call($line, $dblineno);
1475 my $line = shift || ''; # [.|line] expr
1476 my $dbline = shift; $line =~ s/^(\.|(?:[^\d]))/$dbline/;
1477 if ($line =~ /^\s*(\d*)\s*(\S.+)/) {
1478 my ($lineno, $expr) = ($1, $2);
1480 if ($dbline[$lineno] == 0) {
1481 print $OUT "Line $lineno($dbline[$lineno]) does not have an action?\n";
1483 $had_breakpoints{$filename} |= 2;
1484 $dbline{$lineno} =~ s/\0[^\0]*//;
1485 $dbline{$lineno} .= "\0" . action($expr);
1489 print $OUT "Adding an action requires an optional lineno and an expression\n"; # hint
1494 my $line = shift || '';
1495 my $dbline = shift; $line =~ s/^\./$dbline/;
1497 eval { &delete_action(); 1 } or print $OUT $@ and return;
1498 } elsif ($line =~ /^(\S.*)/) {
1499 eval { &delete_action($1); 1 } or print $OUT $@ and return;
1501 print $OUT "Deleting an action requires a line number, or '*' for all\n"; # hint
1508 die "Line $i has no action .\n" if $dbline[$i] == 0;
1509 $dbline{$i} =~ s/\0[^\0]*//; # \^a
1510 delete $dbline{$i} if $dbline{$i} eq '';
1512 print $OUT "Deleting all actions...\n";
1513 for my $file (keys %had_breakpoints) {
1514 local *dbline = $main::{'_<' . $file};
1517 for ($i = 1; $i <= $max ; $i++) {
1518 if (defined $dbline{$i}) {
1519 $dbline{$i} =~ s/\0[^\0]*//;
1520 delete $dbline{$i} if $dbline{$i} eq '';
1522 unless ($had_breakpoints{$file} &= ~2) {
1523 delete $had_breakpoints{$file};
1531 my $line = shift; # [.|line] [cond]
1532 my $dbline = shift; $line =~ s/^\./$dbline/;
1533 if ($line =~ /^\s*$/) {
1534 &cmd_b_line($dbline, 1);
1535 } elsif ($line =~ /^load\b\s*(.*)/) {
1536 my $file = $1; $file =~ s/\s+$//;
1538 } elsif ($line =~ /^(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/) {
1539 my $cond = length $3 ? $3 : '1';
1540 my ($subname, $break) = ($2, $1 eq 'postpone');
1541 $subname =~ s/\'/::/g;
1542 $subname = "${'package'}::" . $subname unless $subname =~ /::/;
1543 $subname = "main".$subname if substr($subname,0,2) eq "::";
1544 $postponed{$subname} = $break ? "break +0 if $cond" : "compile";
1545 } elsif ($line =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/) {
1547 $cond = length $2 ? $2 : '1';
1548 &cmd_b_sub($subname, $cond);
1549 } elsif ($line =~ /^(\d*)\s*(.*)/) {
1550 $line = $1 || $dbline;
1551 $cond = length $2 ? $2 : '1';
1552 &cmd_b_line($line, $cond);
1554 print "confused by line($line)?\n";
1560 $break_on_load{$file} = 1;
1561 $had_breakpoints{$file} |= 1;
1564 sub report_break_on_load {
1565 sort keys %break_on_load;
1573 push @files, $::INC{$file} if $::INC{$file};
1574 $file .= '.pm', redo unless $file =~ /\./;
1576 break_on_load($_) for @files;
1577 @files = report_break_on_load;
1580 print $OUT "Will stop on load of `@files'.\n";
1583 $filename_error = '';
1585 sub breakable_line {
1586 my ($from, $to) = @_;
1589 my $delta = $from < $to ? +1 : -1;
1590 my $limit = $delta > 0 ? $#dbline : 1;
1591 $limit = $to if ($limit - $to) * $delta > 0;
1592 $i += $delta while $dbline[$i] == 0 and ($limit - $i) * $delta > 0;
1594 return $i unless $dbline[$i] == 0;
1595 my ($pl, $upto) = ('', '');
1596 ($pl, $upto) = ('s', "..$to") if @_ >=2 and $from != $to;
1597 die "Line$pl $from$upto$filename_error not breakable\n";
1600 sub breakable_line_in_filename {
1602 local *dbline = $main::{'_<' . $f};
1603 local $filename_error = " of `$f'";
1608 my ($i, $cond) = @_;
1609 $cond = 1 unless @_ >= 2;
1613 die "Line $i$filename_error not breakable.\n" if $dbline[$i] == 0;
1614 $had_breakpoints{$filename} |= 1;
1615 if ($dbline{$i}) { $dbline{$i} =~ s/^[^\0]*/$cond/; }
1616 else { $dbline{$i} = $cond; }
1620 eval { break_on_line(@_); 1 } or do {
1622 print $OUT $@ and return;
1626 sub break_on_filename_line {
1627 my ($f, $i, $cond) = @_;
1628 $cond = 1 unless @_ >= 3;
1629 local *dbline = $main::{'_<' . $f};
1630 local $filename_error = " of `$f'";
1631 local $filename = $f;
1632 break_on_line($i, $cond);
1635 sub break_on_filename_line_range {
1636 my ($f, $from, $to, $cond) = @_;
1637 my $i = breakable_line_in_filename($f, $from, $to);
1638 $cond = 1 unless @_ >= 3;
1639 break_on_filename_line($f,$i,$cond);
1642 sub subroutine_filename_lines {
1643 my ($subname,$cond) = @_;
1644 # Filename below can contain ':'
1645 find_sub($subname) =~ /^(.*):(\d+)-(\d+)$/;
1648 sub break_subroutine {
1649 my $subname = shift;
1650 my ($file,$s,$e) = subroutine_filename_lines($subname) or
1651 die "Subroutine $subname not found.\n";
1652 $cond = 1 unless @_ >= 2;
1653 break_on_filename_line_range($file,$s,$e,@_);
1657 my ($subname,$cond) = @_;
1658 $cond = 1 unless @_ >= 2;
1659 unless (ref $subname eq 'CODE') {
1660 $subname =~ s/\'/::/g;
1662 $subname = "${'package'}::" . $subname
1663 unless $subname =~ /::/;
1664 $subname = "CORE::GLOBAL::$s"
1665 if not defined &$subname and $s !~ /::/ and defined &{"CORE::GLOBAL::$s"};
1666 $subname = "main".$subname if substr($subname,0,2) eq "::";
1668 eval { break_subroutine($subname,$cond); 1 } or do {
1670 print $OUT $@ and return;
1675 my $line = ($_[0] =~ /^\./) ? $dbline : shift || '';
1676 my $dbline = shift; $line =~ s/^\./$dbline/;
1678 eval { &delete_breakpoint(); 1 } or print $OUT $@ and return;
1679 } elsif ($line =~ /^(\S.*)/) {
1680 eval { &delete_breakpoint($line || $dbline); 1 } or do {
1682 print $OUT $@ and return;
1685 print $OUT "Deleting a breakpoint requires a line number, or '*' for all\n"; # hint
1689 sub delete_breakpoint {
1692 die "Line $i not breakable.\n" if $dbline[$i] == 0;
1693 $dbline{$i} =~ s/^[^\0]*//;
1694 delete $dbline{$i} if $dbline{$i} eq '';
1696 print $OUT "Deleting all breakpoints...\n";
1697 for my $file (keys %had_breakpoints) {
1698 local *dbline = $main::{'_<' . $file};
1701 for ($i = 1; $i <= $max ; $i++) {
1702 if (defined $dbline{$i}) {
1703 $dbline{$i} =~ s/^[^\0]+//;
1704 if ($dbline{$i} =~ s/^\0?$//) {
1709 if (not $had_breakpoints{$file} &= ~1) {
1710 delete $had_breakpoints{$file};
1714 undef %postponed_file;
1715 undef %break_on_load;
1719 sub cmd_stop { # As on ^C, but not signal-safy.
1724 my $line = shift || '';
1725 if ($line =~ /^h\s*/) {
1727 } elsif ($line =~ /^(\S.*)$/) {
1728 # support long commands; otherwise bogus errors
1729 # happen when you ask for h on <CR> for example
1730 my $asked = $1; # for proper errmsg
1731 my $qasked = quotemeta($asked); # for searching
1732 # XXX: finds CR but not <CR>
1733 if ($help =~ /^<?(?:[IB]<)$qasked/m) {
1734 while ($help =~ /^(<?(?:[IB]<)$qasked([\s\S]*?)\n)(?!\s)/mg) {
1738 print_help("B<$asked> is not a debugger command.\n");
1741 print_help($summary);
1746 my $current_line = $line;
1748 $line =~ s/^-\s*$/-/;
1749 if ($line =~ /^(\$.*)/s) {
1752 print($OUT "Error: $@\n"), next CMD if $@;
1754 print($OUT "Interpreted as: $1 $s\n");
1757 } elsif ($line =~ /^([\':A-Za-z_][\':\w]*(\[.*\])?)/s) {
1758 my $s = $subname = $1;
1759 $subname =~ s/\'/::/;
1760 $subname = $package."::".$subname
1761 unless $subname =~ /::/;
1762 $subname = "CORE::GLOBAL::$s"
1763 if not defined &$subname and $s !~ /::/
1764 and defined &{"CORE::GLOBAL::$s"};
1765 $subname = "main".$subname if substr($subname,0,2) eq "::";
1766 @pieces = split(/:/,find_sub($subname) || $sub{$subname});
1767 $subrange = pop @pieces;
1768 $file = join(':', @pieces);
1769 if ($file ne $filename) {
1770 print $OUT "Switching to file '$file'.\n"
1771 unless $slave_editor;
1772 *dbline = $main::{'_<' . $file};
1777 if (eval($subrange) < -$window) {
1778 $subrange =~ s/-.*/+/;
1783 print $OUT "Subroutine $subname not found.\n";
1785 } elsif ($line =~ /^\s*$/) {
1786 $incr = $window - 1;
1787 $line = $start . '-' . ($start + $incr);
1789 } elsif ($line =~ /^(\d*)\+(\d*)$/) {
1792 $incr = $window - 1 unless $incr;
1793 $line = $start . '-' . ($start + $incr);
1795 } elsif ($line =~ /^((-?[\d\$\.]+)([-,]([\d\$\.]+))?)?/) {
1796 $end = (!defined $2) ? $max : ($4 ? $4 : $2);
1797 $end = $max if $end > $max;
1799 $i = $line if $i eq '.';
1802 if ($slave_editor) {
1803 print $OUT "\032\032$filename:$i:0\n";
1806 for (; $i <= $end; $i++) {
1808 ($stop,$action) = split(/\0/, $dbline{$i}) if
1810 $arrow = ($i==$current_line
1811 and $filename eq $filename_ini)
1813 : ($dbline[$i]+0 ? ':' : ' ') ;
1814 $arrow .= 'b' if $stop;
1815 $arrow .= 'a' if $action;
1816 print $OUT "$i$arrow\t", $dbline[$i];
1817 $i++, last if $signal;
1819 print $OUT "\n" unless $dbline[$i-1] =~ /\n$/;
1821 $start = $i; # remember in case they want more
1822 $start = $max if $start > $max;
1827 my $arg = shift || 'abw'; $arg = 'abw' unless $CommandSet eq '580'; # sigh...
1828 my $action_wanted = ($arg =~ /a/) ? 1 : 0;
1829 my $break_wanted = ($arg =~ /b/) ? 1 : 0;
1830 my $watch_wanted = ($arg =~ /w/) ? 1 : 0;
1832 if ($break_wanted or $action_wanted) {
1833 for my $file (keys %had_breakpoints) {
1834 local *dbline = $main::{'_<' . $file};
1837 for ($i = 1; $i <= $max; $i++) {
1838 if (defined $dbline{$i}) {
1839 print $OUT "$file:\n" unless $was++;
1840 print $OUT " $i:\t", $dbline[$i];
1841 ($stop,$action) = split(/\0/, $dbline{$i});
1842 print $OUT " break if (", $stop, ")\n"
1843 if $stop and $break_wanted;
1844 print $OUT " action: ", $action, "\n"
1845 if $action and $action_wanted;
1851 if (%postponed and $break_wanted) {
1852 print $OUT "Postponed breakpoints in subroutines:\n";
1854 for $subname (keys %postponed) {
1855 print $OUT " $subname\t$postponed{$subname}\n";
1859 my @have = map { # Combined keys
1860 keys %{$postponed_file{$_}}
1861 } keys %postponed_file;
1862 if (@have and ($break_wanted or $action_wanted)) {
1863 print $OUT "Postponed breakpoints in files:\n";
1865 for $file (keys %postponed_file) {
1866 my $db = $postponed_file{$file};
1867 print $OUT " $file:\n";
1868 for $line (sort {$a <=> $b} keys %$db) {
1869 print $OUT " $line:\n";
1870 my ($stop,$action) = split(/\0/, $$db{$line});
1871 print $OUT " break if (", $stop, ")\n"
1872 if $stop and $break_wanted;
1873 print $OUT " action: ", $action, "\n"
1874 if $action and $action_wanted;
1880 if (%break_on_load and $break_wanted) {
1881 print $OUT "Breakpoints on load:\n";
1883 for $file (keys %break_on_load) {
1884 print $OUT " $file\n";
1888 if ($watch_wanted) {
1890 print $OUT "Watch-expressions:\n" if @to_watch;
1891 for my $expr (@to_watch) {
1892 print $OUT " $expr\n";
1904 my $opt = shift || ''; # opt[=val]
1905 if ($opt =~ /^(\S.*)/) {
1915 print $OUT "The old O command is now the o command.\n"; # hint
1916 print $OUT "Use 'h' to get current command help synopsis or\n"; #
1917 print $OUT "use 'o CommandSet=pre580' to revert to old usage\n"; #
1923 if ($line =~ /^(\d*)$/) {
1924 $incr = $window - 1;
1927 $line = $start . '-' . ($start + $incr);
1933 my $expr = shift || '';
1934 if ($expr =~ /^(\S.*)/) {
1935 push @to_watch, $expr;
1938 $val = (defined $val) ? "'$val'" : 'undef' ;
1939 push @old_watch, $val;
1942 print $OUT "Adding a watch-expression requires an expression\n"; # hint
1947 my $expr = shift || '';
1950 print $OUT "Deleting all watch expressions ...\n";
1951 @to_watch = @old_watch = ();
1952 } elsif ($expr =~ /^(\S.*)/) {
1954 foreach (@to_watch) {
1955 my $val = $to_watch[$i_cnt];
1956 if ($val eq $expr) { # =~ m/^\Q$i$/) {
1957 splice(@to_watch, $i_cnt, 1);
1962 print $OUT "Deleting a watch-expression requires an expression, or '*' for all\n"; # hint
1966 ### END of the API section
1969 @saved = ($@, $!, $^E, $,, $/, $\, $^W);
1970 $, = ""; $/ = "\n"; $\ = ""; $^W = 0;
1973 sub print_lineinfo {
1974 resetterm(1) if $LINEINFO eq $OUT and $term_pid != $$;
1980 # The following takes its argument via $evalarg to preserve current @_
1983 my $subname = shift;
1984 if ($postponed{$subname} =~ s/^break\s([+-]?\d+)\s+if\s//) {
1985 my $offset = $1 || 0;
1986 # Filename below can contain ':'
1987 my ($file,$i) = (find_sub($subname) =~ /^(.*):(\d+)-.*$/);
1990 local *dbline = $main::{'_<' . $file};
1991 local $^W = 0; # != 0 is magical below
1992 $had_breakpoints{$file} |= 1;
1994 ++$i until $dbline[$i] != 0 or $i >= $max;
1995 $dbline{$i} = delete $postponed{$subname};
1998 print $OUT "Subroutine $subname not found.\n";
2002 elsif ($postponed{$subname} eq 'compile') { $signal = 1 }
2003 #print $OUT "In postponed_sub for `$subname'.\n";
2007 if ($ImmediateStop) {
2011 return &postponed_sub
2012 unless ref \$_[0] eq 'GLOB'; # A subroutine is compiled.
2013 # Cannot be done before the file is compiled
2014 local *dbline = shift;
2015 my $filename = $dbline;
2016 $filename =~ s/^_<//;
2018 $signal = 1, print $OUT "'$filename' loaded...\n"
2019 if $break_on_load{$filename};
2020 print_lineinfo(' ' x $stack_depth, "Package $filename.\n") if $frame;
2021 return unless $postponed_file{$filename};
2022 $had_breakpoints{$filename} |= 1;
2023 #%dbline = %{$postponed_file{$filename}}; # Cannot be done: unsufficient magic
2025 for $key (keys %{$postponed_file{$filename}}) {
2026 $dbline{$key} = ${$postponed_file{$filename}}{$key};
2028 delete $postponed_file{$filename};
2032 local ($savout) = select(shift);
2033 my $osingle = $single;
2034 my $otrace = $trace;
2035 $single = $trace = 0;
2038 unless (defined &main::dumpValue) {
2041 if (defined &main::dumpValue) {
2046 my $maxdepth = shift || $option{dumpDepth};
2047 $maxdepth = -1 unless defined $maxdepth; # -1 means infinite depth
2048 &main::dumpValue($v, $maxdepth);
2051 print $OUT "dumpvar.pl not available.\n";
2058 # Tied method do not create a context, so may get wrong message:
2063 resetterm(1) if $fh eq $LINEINFO and $LINEINFO eq $OUT and $term_pid != $$;
2064 my @sub = dump_trace($_[0] + 1, $_[1]);
2065 my $short = $_[2]; # Print short report, next one for sub name
2067 for ($i=0; $i <= $#sub; $i++) {
2070 my $args = defined $sub[$i]{args}
2071 ? "(@{ $sub[$i]{args} })"
2073 $args = (substr $args, 0, $maxtrace - 3) . '...'
2074 if length $args > $maxtrace;
2075 my $file = $sub[$i]{file};
2076 $file = $file eq '-e' ? $file : "file `$file'" unless $short;
2078 $s = (substr $s, 0, $maxtrace - 3) . '...' if length $s > $maxtrace;
2080 my $sub = @_ >= 4 ? $_[3] : $s;
2081 print $fh "$sub[$i]{context}=$sub$args from $file:$sub[$i]{line}\n";
2083 print $fh "$sub[$i]{context} = $s$args" .
2084 " called from $file" .
2085 " line $sub[$i]{line}\n";
2092 my $count = shift || 1e9;
2095 my ($p,$file,$line,$sub,$h,$args,$e,$r,@a,@sub,$context);
2096 my $nothard = not $frame & 8;
2097 local $frame = 0; # Do not want to trace this.
2098 my $otrace = $trace;
2101 $i < $count and ($p,$file,$line,$sub,$h,$context,$e,$r) = caller($i);
2106 if (not defined $arg) {
2108 } elsif ($nothard and tied $arg) {
2110 } elsif ($nothard and $type = ref $arg) {
2111 push @a, "ref($type)";
2113 local $_ = "$arg"; # Safe to stringify now - should not call f().
2116 unless /^(?: -?[\d.]+ | \*[\w:]* )$/x;
2117 s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
2118 s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
2122 $context = $context ? '@' : (defined $context ? "\$" : '.');
2123 $args = $h ? [@a] : undef;
2124 $e =~ s/\n\s*\;\s*\Z// if $e;
2125 $e =~ s/([\\\'])/\\$1/g if $e;
2127 $sub = "require '$e'";
2128 } elsif (defined $r) {
2130 } elsif ($sub eq '(eval)') {
2131 $sub = "eval {...}";
2133 push(@sub, {context => $context, sub => $sub, args => $args,
2134 file => $file, line => $line});
2143 while ($action =~ s/\\$//) {
2152 # i hate using globals!
2153 $balanced_brace_re ||= qr{
2156 (?> [^{}] + ) # Non-parens without backtracking
2158 (??{ $balanced_brace_re }) # Group with matching parens
2162 return $_[0] !~ m/$balanced_brace_re/;
2166 &readline("cont: ");
2170 # We save, change, then restore STDIN and STDOUT to avoid fork() since
2171 # some non-Unix systems can do system() but have problems with fork().
2172 open(SAVEIN,"<&STDIN") || &warn("Can't save STDIN");
2173 open(SAVEOUT,">&STDOUT") || &warn("Can't save STDOUT");
2174 open(STDIN,"<&IN") || &warn("Can't redirect STDIN");
2175 open(STDOUT,">&OUT") || &warn("Can't redirect STDOUT");
2177 # XXX: using csh or tcsh destroys sigint retvals!
2179 open(STDIN,"<&SAVEIN") || &warn("Can't restore STDIN");
2180 open(STDOUT,">&SAVEOUT") || &warn("Can't restore STDOUT");
2185 # most of the $? crud was coping with broken cshisms
2187 &warn("(Command exited ", ($? >> 8), ")\n");
2189 &warn( "(Command died of SIG#", ($? & 127),
2190 (($? & 128) ? " -- core dumped" : "") , ")", "\n");
2200 eval { require Term::ReadLine } or die $@;
2203 my ($i, $o) = split $tty, /,/;
2204 $o = $i unless defined $o;
2205 open(IN,"<$i") or die "Cannot open TTY `$i' for read: $!";
2206 open(OUT,">$o") or die "Cannot open TTY `$o' for write: $!";
2209 my $sel = select($OUT);
2213 eval "require Term::Rendezvous;" or die;
2214 my $rv = $ENV{PERLDB_NOTTY} || "/tmp/perldbtty$$";
2215 my $term_rv = new Term::Rendezvous $rv;
2217 $OUT = $term_rv->OUT;
2220 if ($term_pid eq '-1') { # In a TTY with another debugger
2224 $term = new Term::ReadLine::Stub 'perldb', $IN, $OUT;
2226 $term = new Term::ReadLine 'perldb', $IN, $OUT;
2228 $rl_attribs = $term->Attribs;
2229 $rl_attribs->{basic_word_break_characters} .= '-:+/*,[])}'
2230 if defined $rl_attribs->{basic_word_break_characters}
2231 and index($rl_attribs->{basic_word_break_characters}, ":") == -1;
2232 $rl_attribs->{special_prefixes} = '$@&%';
2233 $rl_attribs->{completer_word_break_characters} .= '$@&%';
2234 $rl_attribs->{completion_function} = \&db_complete;
2236 $LINEINFO = $OUT unless defined $LINEINFO;
2237 $lineinfo = $console unless defined $lineinfo;
2239 if ($term->Features->{setHistory} and "@hist" ne "?") {
2240 $term->SetHistory(@hist);
2242 ornaments($ornaments) if defined $ornaments;
2246 # Example get_fork_TTY functions
2247 sub xterm_get_fork_TTY {
2248 (my $name = $0) =~ s,^.*[/\\],,s;
2249 open XT, qq[3>&1 xterm -title "Daughter Perl debugger $pids $name" -e sh -c 'tty 1>&3;\
2253 $pidprompt = ''; # Shown anyway in titlebar
2257 # This example function resets $IN, $OUT itself
2258 sub os2_get_fork_TTY {
2259 local $^F = 40; # XXXX Fixme!
2261 my ($in1, $out1, $in2, $out2);
2262 # Having -d in PERL5OPT would lead to a disaster...
2263 local $ENV{PERL5OPT} = $ENV{PERL5OPT} if $ENV{PERL5OPT};
2264 $ENV{PERL5OPT} =~ s/(?:^|(?<=\s))-d\b// if $ENV{PERL5OPT};
2265 $ENV{PERL5OPT} =~ s/(?:^|(?<=\s))-d\B/-/ if $ENV{PERL5OPT};
2266 print $OUT "Making kid PERL5OPT->`$ENV{PERL5OPT}'.\n" if $ENV{PERL5OPT};
2267 local $ENV{PERL5LIB} = $ENV{PERL5LIB} ? $ENV{PERL5LIB} : $ENV{PERLLIB};
2268 $ENV{PERL5LIB} = '' unless defined $ENV{PERL5LIB};
2269 $ENV{PERL5LIB} = join ';', @ini_INC, split /;/, $ENV{PERL5LIB};
2270 (my $name = $0) =~ s,^.*[/\\],,s;
2272 if ( pipe $in1, $out1 and pipe $in2, $out2
2273 # system P_SESSION will fail if there is another process
2274 # in the same session with a "dependent" asynchronous child session.
2275 and @args = ($rl, fileno $in1, fileno $out2,
2276 "Daughter Perl debugger $pids $name") and
2277 (($kpid = CORE::system 4, $^X, '-we', <<'ES', @args) >= 0 # P_SESSION
2278 END {sleep 5 unless $loaded}
2279 BEGIN {open STDIN, '</dev/con' or warn "reopen stdin: $!"}
2282 my ($rl, $in) = (shift, shift); # Read from $in and pass through
2284 system P_NOWAIT, $^X, '-we', <<EOS or die "Cannot start a grandkid";
2285 open IN, '<&=$in' or die "open <&=$in: \$!";
2286 \$| = 1; print while sysread IN, \$_, 1<<16;
2290 open OUT, ">&=$out" or die "Cannot open &=$out for writing: $!";
2292 require Term::ReadKey if $rl;
2293 Term::ReadKey::ReadMode(4) if $rl; # Nodelay on kbd. Pipe is automatically nodelay...
2294 print while sysread STDIN, $_, 1<<($rl ? 16 : 0);
2296 or warn "system P_SESSION: $!, $^E" and 0)
2297 and close $in1 and close $out2 ) {
2298 $pidprompt = ''; # Shown anyway in titlebar
2299 reset_IN_OUT($in2, $out1);
2301 return ''; # Indicate that reset_IN_OUT is called
2306 sub create_IN_OUT { # Create a window with IN/OUT handles redirected there
2307 my $in = &get_fork_TTY if defined &get_fork_TTY;
2308 $in = $fork_TTY if defined $fork_TTY; # Backward compatibility
2309 if (not defined $in) {
2311 print_help(<<EOP) if $why == 1;
2312 I<#########> Forked, but do not know how to create a new B<TTY>. I<#########>
2314 print_help(<<EOP) if $why == 2;
2315 I<#########> Daughter session, do not know how to change a B<TTY>. I<#########>
2316 This may be an asynchronous session, so the parent debugger may be active.
2318 print_help(<<EOP) if $why != 4;
2319 Since two debuggers fight for the same TTY, input is severely entangled.
2323 I know how to switch the output to a different window in xterms
2324 and OS/2 consoles only. For a manual switch, put the name of the created I<TTY>
2325 in B<\$DB::fork_TTY>, or define a function B<DB::get_fork_TTY()> returning this.
2327 On I<UNIX>-like systems one can get the name of a I<TTY> for the given window
2328 by typing B<tty>, and disconnect the I<shell> from I<TTY> by B<sleep 1000000>.
2331 } elsif ($in ne '') {
2334 $console = ''; # Indicate no need to open-from-the-console
2339 sub resetterm { # We forked, so we need a different TTY
2341 my $systemed = $in > 1 ? '-' : '';
2343 $pids =~ s/\]/$systemed->$$]/;
2345 $pids = "[$term_pid->$$]";
2349 return unless $CreateTTY & $in;
2356 my $left = @typeahead;
2357 my $got = shift @typeahead;
2359 print $OUT "auto(-$left)", shift, $got, "\n";
2360 $term->AddHistory($got)
2361 if length($got) > 1 and defined $term->Features->{addHistory};
2367 my $line = CORE::readline($cmdfhs[-1]);
2368 defined $line ? (print $OUT ">> $line" and return $line)
2369 : close pop @cmdfhs;
2371 if (ref $OUT and UNIVERSAL::isa($OUT, 'IO::Socket::INET')) {
2372 $OUT->write(join('', @_));
2374 $IN->recv( $stuff, 2048 ); # XXX: what's wrong with sysread?
2378 $term->readline(@_);
2383 my ($opt, $val)= @_;
2384 $val = option_val($opt,'N/A');
2385 $val =~ s/([\\\'])/\\$1/g;
2386 printf $OUT "%20s = '%s'\n", $opt, $val;
2390 my ($opt, $default)= @_;
2392 if (defined $optionVars{$opt}
2393 and defined ${$optionVars{$opt}}) {
2394 $val = ${$optionVars{$opt}};
2395 } elsif (defined $optionAction{$opt}
2396 and defined &{$optionAction{$opt}}) {
2397 $val = &{$optionAction{$opt}}();
2398 } elsif (defined $optionAction{$opt}
2399 and not defined $option{$opt}
2400 or defined $optionVars{$opt}
2401 and not defined ${$optionVars{$opt}}) {
2404 $val = $option{$opt};
2406 $val = $default unless defined $val;
2413 # too dangerous to let intuitive usage overwrite important things
2414 # defaultion should never be the default
2415 my %opt_needs_val = map { ( $_ => 1 ) } qw{
2416 dumpDepth arrayDepth hashDepth LineInfo maxTraceLen ornaments windowSize
2417 pager quote ReadLine recallCommand RemotePort ShellBang TTY
2422 s/^(\w+)(\W?)// or print($OUT "Invalid option `$_'\n"), last;
2423 my ($opt,$sep) = ($1,$2);
2426 print($OUT "Option query `$opt?' followed by non-space `$_'\n"), last
2428 #&dump_option($opt);
2429 } elsif ($sep !~ /\S/) {
2431 $val = "1"; # this is an evil default; make 'em set it!
2432 } elsif ($sep eq "=") {
2433 if (s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x) {
2435 ($val = $2) =~ s/\\([$quote\\])/$1/g;
2439 print OUT qq(Option better cleared using $opt=""\n)
2443 } else { #{ to "let some poor schmuck bounce on the % key in B<vi>."
2444 my ($end) = "\\" . substr( ")]>}$sep", index("([<{",$sep), 1 ); #}
2445 s/^(([^\\$end]|\\[\\$end])*)$end($|\s+)// or
2446 print($OUT "Unclosed option value `$opt$sep$_'\n"), last;
2447 ($val = $1) =~ s/\\([\\$end])/$1/g;
2451 my $matches = grep( /^\Q$opt/ && ($option = $_), @options )
2452 || grep( /^\Q$opt/i && ($option = $_), @options );
2454 print($OUT "Unknown option `$opt'\n"), next unless $matches;
2455 print($OUT "Ambiguous option `$opt'\n"), next if $matches > 1;
2457 if ($opt_needs_val{$option} && $val_defaulted) {
2458 my $cmd = ($CommandSet eq '580') ? 'o' : 'O';
2459 print $OUT "Option `$opt' is non-boolean. Use `$cmd $option=VAL' to set, `$cmd $option?' to query\n";
2463 $option{$option} = $val if defined $val;
2468 require '$optionRequire{$option}';
2470 } || die # XXX: shouldn't happen
2471 if defined $optionRequire{$option} &&
2474 ${$optionVars{$option}} = $val
2475 if defined $optionVars{$option} &&
2478 &{$optionAction{$option}} ($val)
2479 if defined $optionAction{$option} &&
2480 defined &{$optionAction{$option}} &&
2484 dump_option($option) unless $OUT eq \*STDERR;
2489 my ($stem,@list) = @_;
2491 $ENV{"${stem}_n"} = @list;
2492 for $i (0 .. $#list) {
2494 $val =~ s/\\/\\\\/g;
2495 $val =~ s/([\0-\37\177\200-\377])/"\\0x" . unpack('H2',$1)/eg;
2496 $ENV{"${stem}_$i"} = $val;
2503 my $n = delete $ENV{"${stem}_n"};
2505 for $i (0 .. $n - 1) {
2506 $val = delete $ENV{"${stem}_$i"};
2507 $val =~ s/\\((\\)|0x(..))/ $2 ? $2 : pack('H2', $3) /ge;
2515 return; # Put nothing on the stack - malloc/free land!
2519 my($msg)= join("",@_);
2520 $msg .= ": $!\n" unless $msg =~ /\n$/;
2526 my $switch_li = $LINEINFO eq $OUT;
2527 if ($term and $term->Features->{newTTY}) {
2528 ($IN, $OUT) = (shift, shift);
2529 $term->newTTY($IN, $OUT);
2531 &warn("Too late to set IN/OUT filehandles, enabled on next `R'!\n");
2533 ($IN, $OUT) = (shift, shift);
2535 my $o = select $OUT;
2538 $LINEINFO = $OUT if $switch_li;
2542 if (@_ and $term and $term->Features->{newTTY}) {
2543 my ($in, $out) = shift;
2545 ($in, $out) = split /,/, $in, 2;
2549 open IN, $in or die "cannot open `$in' for read: $!";
2550 open OUT, ">$out" or die "cannot open `$out' for write: $!";
2551 reset_IN_OUT(\*IN,\*OUT);
2554 &warn("Too late to set TTY, enabled on next `R'!\n") if $term and @_;
2555 # Useful if done through PERLDB_OPTS:
2556 $console = $tty = shift if @_;
2562 &warn("Too late to set noTTY, enabled on next `R'!\n") if @_;
2564 $notty = shift if @_;
2570 &warn("Too late to set ReadLine, enabled on next `R'!\n") if @_;
2578 &warn("Too late to set RemotePort, enabled on next 'R'!\n") if @_;
2580 $remoteport = shift if @_;
2585 if (${$term->Features}{tkRunning}) {
2586 return $term->tkRunning(@_);
2589 print $OUT "tkRunning not supported by current ReadLine package.\n";
2596 &warn("Too late to set up NonStop mode, enabled on next `R'!\n") if @_;
2598 $runnonstop = shift if @_;
2605 $pager="|".$pager unless $pager =~ /^(\+?\>|\|)/;
2612 $sh = quotemeta shift;
2613 $sh .= "\\b" if $sh =~ /\w$/;
2617 $psh =~ s/\\(.)/$1/g;
2622 if (defined $term) {
2623 local ($warnLevel,$dieLevel) = (0, 1);
2624 return '' unless $term->Features->{ornaments};
2625 eval { $term->ornaments(@_) } || '';
2633 $rc = quotemeta shift;
2634 $rc .= "\\b" if $rc =~ /\w$/;
2638 $prc =~ s/\\(.)/$1/g;
2643 return $lineinfo unless @_;
2645 my $stream = ($lineinfo =~ /^(\+?\>|\|)/) ? $lineinfo : ">$lineinfo";
2646 $slave_editor = ($stream =~ /^\|/);
2647 open(LINEINFO, "$stream") || &warn("Cannot open `$stream' for write");
2648 $LINEINFO = \*LINEINFO;
2649 my $save = select($LINEINFO);
2655 sub list_modules { # versions
2663 s/^Term::ReadLine::readline$/readline/;
2664 if (defined ${ $_ . '::VERSION' }) {
2665 $version{$file} = "${ $_ . '::VERSION' } from ";
2667 $version{$file} .= $INC{$file};
2669 dumpit($OUT,\%version);
2673 # XXX: make sure there are tabs between the command and explanation,
2674 # or print_help will screw up your formatting if you have
2675 # eeevil ornaments enabled. This is an insane mess.
2678 Help is currently only available for the new 580 CommandSet,
2679 if you really want old behaviour, presumably you know what
2683 B<s> [I<expr>] Single step [in I<expr>].
2684 B<n> [I<expr>] Next, steps over subroutine calls [in I<expr>].
2685 <B<CR>> Repeat last B<n> or B<s> command.
2686 B<r> Return from current subroutine.
2687 B<c> [I<line>|I<sub>] Continue; optionally inserts a one-time-only breakpoint
2688 at the specified position.
2689 B<l> I<min>B<+>I<incr> List I<incr>+1 lines starting at I<min>.
2690 B<l> I<min>B<->I<max> List lines I<min> through I<max>.
2691 B<l> I<line> List single I<line>.
2692 B<l> I<subname> List first window of lines from subroutine.
2693 B<l> I<\$var> List first window of lines from subroutine referenced by I<\$var>.
2694 B<l> List next window of lines.
2695 B<-> List previous window of lines.
2696 B<v> [I<line>] View window around I<line>.
2697 B<.> Return to the executed line.
2698 B<f> I<filename> Switch to viewing I<filename>. File must be already loaded.
2699 I<filename> may be either the full name of the file, or a regular
2700 expression matching the full file name:
2701 B<f> I</home/me/foo.pl> and B<f> I<oo\\.> may access the same file.
2702 Evals (with saved bodies) are considered to be filenames:
2703 B<f> I<(eval 7)> and B<f> I<eval 7\\b> access the body of the 7th eval
2704 (in the order of execution).
2705 B</>I<pattern>B</> Search forwards for I<pattern>; final B</> is optional.
2706 B<?>I<pattern>B<?> Search backwards for I<pattern>; final B<?> is optional.
2707 B<L> [I<a|b|w>] List actions and or breakpoints and or watch-expressions.
2708 B<S> [[B<!>]I<pattern>] List subroutine names [not] matching I<pattern>.
2709 B<t> Toggle trace mode.
2710 B<t> I<expr> Trace through execution of I<expr>.
2711 B<b> Sets breakpoint on current line)
2712 B<b> [I<line>] [I<condition>]
2713 Set breakpoint; I<line> defaults to the current execution line;
2714 I<condition> breaks if it evaluates to true, defaults to '1'.
2715 B<b> I<subname> [I<condition>]
2716 Set breakpoint at first line of subroutine.
2717 B<b> I<\$var> Set breakpoint at first line of subroutine referenced by I<\$var>.
2718 B<b> B<load> I<filename> Set breakpoint on 'require'ing the given file.
2719 B<b> B<postpone> I<subname> [I<condition>]
2720 Set breakpoint at first line of subroutine after
2722 B<b> B<compile> I<subname>
2723 Stop after the subroutine is compiled.
2724 B<B> [I<line>] Delete the breakpoint for I<line>.
2725 B<B> I<*> Delete all breakpoints.
2726 B<a> [I<line>] I<command>
2727 Set an action to be done before the I<line> is executed;
2728 I<line> defaults to the current execution line.
2729 Sequence is: check for breakpoint/watchpoint, print line
2730 if necessary, do action, prompt user if necessary,
2733 B<A> [I<line>] Delete the action for I<line>.
2734 B<A> I<*> Delete all actions.
2735 B<w> I<expr> Add a global watch-expression.
2737 B<W> I<expr> Delete a global watch-expression.
2738 B<W> I<*> Delete all watch-expressions.
2739 B<V> [I<pkg> [I<vars>]] List some (default all) variables in package (default current).
2740 Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps.
2741 B<X> [I<vars>] Same as \"B<V> I<currentpackage> [I<vars>]\".
2742 B<y> [I<n> [I<Vars>]] List lexicals in higher scope <n>. Vars same as B<V>.
2743 B<x> I<expr> Evals expression in list context, dumps the result.
2744 B<m> I<expr> Evals expression in list context, prints methods callable
2745 on the first element of the result.
2746 B<m> I<class> Prints methods callable via the given class.
2747 B<M> Show versions of loaded modules.
2749 B<<> ? List Perl commands to run before each prompt.
2750 B<<> I<expr> Define Perl command to run before each prompt.
2751 B<<<> I<expr> Add to the list of Perl commands to run before each prompt.
2752 B<>> ? List Perl commands to run after each prompt.
2753 B<>> I<expr> Define Perl command to run after each prompt.
2754 B<>>B<>> I<expr> Add to the list of Perl commands to run after each prompt.
2755 B<{> I<db_command> Define debugger command to run before each prompt.
2756 B<{> ? List debugger commands to run before each prompt.
2757 B<{{> I<db_command> Add to the list of debugger commands to run before each prompt.
2758 B<$prc> I<number> Redo a previous command (default previous command).
2759 B<$prc> I<-number> Redo number'th-to-last command.
2760 B<$prc> I<pattern> Redo last command that started with I<pattern>.
2761 See 'B<O> I<recallCommand>' too.
2762 B<$psh$psh> I<cmd> Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)"
2763 . ( $rc eq $sh ? "" : "
2764 B<$psh> [I<cmd>] Run I<cmd> in subshell (forces \"\$SHELL -c 'cmd'\")." ) . "
2765 See 'B<O> I<shellBang>' too.
2766 B<source> I<file> Execute I<file> containing debugger commands (may nest).
2767 B<H> I<-number> Display last number commands (default all).
2768 B<p> I<expr> Same as \"I<print {DB::OUT} expr>\" in current package.
2769 B<|>I<dbcmd> Run debugger command, piping DB::OUT to current pager.
2770 B<||>I<dbcmd> Same as B<|>I<dbcmd> but DB::OUT is temporarilly select()ed as well.
2771 B<\=> [I<alias> I<value>] Define a command alias, or list current aliases.
2772 I<command> Execute as a perl statement in current package.
2773 B<R> Pure-man-restart of debugger, some of debugger state
2774 and command-line options may be lost.
2775 Currently the following settings are preserved:
2776 history, breakpoints and actions, debugger B<O>ptions
2777 and the following command-line options: I<-w>, I<-I>, I<-e>.
2779 B<o> [I<opt>] ... Set boolean option to true
2780 B<o> [I<opt>B<?>] Query options
2781 B<o> [I<opt>B<=>I<val>] [I<opt>=B<\">I<val>B<\">] ...
2782 Set options. Use quotes in spaces in value.
2783 I<recallCommand>, I<ShellBang> chars used to recall command or spawn shell;
2784 I<pager> program for output of \"|cmd\";
2785 I<tkRunning> run Tk while prompting (with ReadLine);
2786 I<signalLevel> I<warnLevel> I<dieLevel> level of verbosity;
2787 I<inhibit_exit> Allows stepping off the end of the script.
2788 I<ImmediateStop> Debugger should stop as early as possible.
2789 I<RemotePort> Remote hostname:port for remote debugging
2790 The following options affect what happens with B<V>, B<X>, and B<x> commands:
2791 I<arrayDepth>, I<hashDepth> print only first N elements ('' for all);
2792 I<compactDump>, I<veryCompact> change style of array and hash dump;
2793 I<globPrint> whether to print contents of globs;
2794 I<DumpDBFiles> dump arrays holding debugged files;
2795 I<DumpPackages> dump symbol tables of packages;
2796 I<DumpReused> dump contents of \"reused\" addresses;
2797 I<quote>, I<HighBit>, I<undefPrint> change style of string dump;
2798 I<bareStringify> Do not print the overload-stringified value;
2799 Other options include:
2800 I<PrintRet> affects printing of return value after B<r> command,
2801 I<frame> affects printing messages on subroutine entry/exit.
2802 I<AutoTrace> affects printing messages on possible breaking points.
2803 I<maxTraceLen> gives max length of evals/args listed in stack trace.
2804 I<ornaments> affects screen appearance of the command line.
2805 I<CreateTTY> bits control attempts to create a new TTY on events:
2806 1: on fork() 2: debugger is started inside debugger
2808 During startup options are initialized from \$ENV{PERLDB_OPTS}.
2809 You can put additional initialization options I<TTY>, I<noTTY>,
2810 I<ReadLine>, I<NonStop>, and I<RemotePort> there (or use
2811 `B<R>' after you set them).
2813 B<q> or B<^D> Quit. Set B<\$DB::finished = 0> to debug global destruction.
2814 B<h> Summary of debugger commands.
2815 B<h> [I<db_command>] Get help [on a specific debugger command], enter B<|h> to page.
2816 B<h h> Long help for debugger commands
2817 B<$doccmd> I<manpage> Runs the external doc viewer B<$doccmd> command on the
2818 named Perl I<manpage>, or on B<$doccmd> itself if omitted.
2819 Set B<\$DB::doccmd> to change viewer.
2821 Type `|h h' for a paged display if this was too hard to read.
2823 "; # Fix balance of vi % matching: }}}}
2825 # note: tabs in the following section are not-so-helpful
2826 $summary = <<"END_SUM";
2827 I<List/search source lines:> I<Control script execution:>
2828 B<l> [I<ln>|I<sub>] List source code B<T> Stack trace
2829 B<-> or B<.> List previous/current line B<s> [I<expr>] Single step [in expr]
2830 B<v> [I<line>] View around line B<n> [I<expr>] Next, steps over subs
2831 B<f> I<filename> View source in file <B<CR>/B<Enter>> Repeat last B<n> or B<s>
2832 B</>I<pattern>B</> B<?>I<patt>B<?> Search forw/backw B<r> Return from subroutine
2833 B<M> Show module versions B<c> [I<ln>|I<sub>] Continue until position
2834 I<Debugger controls:> B<L> List break/watch/actions
2835 B<o> [...] Set debugger options B<t> [I<expr>] Toggle trace [trace expr]
2836 B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
2837 B<$prc> [I<N>|I<pat>] Redo a previous command B<B> I<ln|*> Delete a/all breakpoints
2838 B<H> [I<-num>] Display last num commands B<a> [I<ln>] I<cmd> Do cmd before line
2839 B<=> [I<a> I<val>] Define/list an alias B<A> I<ln|*> Delete a/all actions
2840 B<h> [I<db_cmd>] Get help on command B<w> I<expr> Add a watch expression
2841 B<h h> Complete help page B<W> I<expr|*> Delete a/all watch exprs
2842 B<|>[B<|>]I<db_cmd> Send output to pager B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess
2843 B<q> or B<^D> Quit B<R> Attempt a restart
2844 I<Data Examination:> B<expr> Execute perl code, also see: B<s>,B<n>,B<t> I<expr>
2845 B<x>|B<m> I<expr> Evals expr in list context, dumps the result or lists methods.
2846 B<p> I<expr> Print expression (uses script's current package).
2847 B<S> [[B<!>]I<pat>] List subroutine names [not] matching pattern
2848 B<V> [I<Pk> [I<Vars>]] List Variables in Package. Vars can be ~pattern or !pattern.
2849 B<X> [I<Vars>] Same as \"B<V> I<current_package> [I<Vars>]\".
2850 B<y> [I<n> [I<Vars>]] List lexicals in higher scope <n>. Vars same as B<V>.
2851 For more help, type B<h> I<cmd_letter>, or run B<$doccmd perldebug> for all docs.
2853 # ')}}; # Fix balance of vi % matching
2855 # and this is really numb...
2858 B<s> [I<expr>] Single step [in I<expr>].
2859 B<n> [I<expr>] Next, steps over subroutine calls [in I<expr>].
2860 <B<CR>> Repeat last B<n> or B<s> command.
2861 B<r> Return from current subroutine.
2862 B<c> [I<line>|I<sub>] Continue; optionally inserts a one-time-only breakpoint
2863 at the specified position.
2864 B<l> I<min>B<+>I<incr> List I<incr>+1 lines starting at I<min>.
2865 B<l> I<min>B<->I<max> List lines I<min> through I<max>.
2866 B<l> I<line> List single I<line>.
2867 B<l> I<subname> List first window of lines from subroutine.
2868 B<l> I<\$var> List first window of lines from subroutine referenced by I<\$var>.
2869 B<l> List next window of lines.
2870 B<-> List previous window of lines.
2871 B<w> [I<line>] List window around I<line>.
2872 B<.> Return to the executed line.
2873 B<f> I<filename> Switch to viewing I<filename>. File must be already loaded.
2874 I<filename> may be either the full name of the file, or a regular
2875 expression matching the full file name:
2876 B<f> I</home/me/foo.pl> and B<f> I<oo\\.> may access the same file.
2877 Evals (with saved bodies) are considered to be filenames:
2878 B<f> I<(eval 7)> and B<f> I<eval 7\\b> access the body of the 7th eval
2879 (in the order of execution).
2880 B</>I<pattern>B</> Search forwards for I<pattern>; final B</> is optional.
2881 B<?>I<pattern>B<?> Search backwards for I<pattern>; final B<?> is optional.
2882 B<L> List all breakpoints and actions.
2883 B<S> [[B<!>]I<pattern>] List subroutine names [not] matching I<pattern>.
2884 B<t> Toggle trace mode.
2885 B<t> I<expr> Trace through execution of I<expr>.
2886 B<b> [I<line>] [I<condition>]
2887 Set breakpoint; I<line> defaults to the current execution line;
2888 I<condition> breaks if it evaluates to true, defaults to '1'.
2889 B<b> I<subname> [I<condition>]
2890 Set breakpoint at first line of subroutine.
2891 B<b> I<\$var> Set breakpoint at first line of subroutine referenced by I<\$var>.
2892 B<b> B<load> I<filename> Set breakpoint on `require'ing the given file.
2893 B<b> B<postpone> I<subname> [I<condition>]
2894 Set breakpoint at first line of subroutine after
2896 B<b> B<compile> I<subname>
2897 Stop after the subroutine is compiled.
2898 B<d> [I<line>] Delete the breakpoint for I<line>.
2899 B<D> Delete all breakpoints.
2900 B<a> [I<line>] I<command>
2901 Set an action to be done before the I<line> is executed;
2902 I<line> defaults to the current execution line.
2903 Sequence is: check for breakpoint/watchpoint, print line
2904 if necessary, do action, prompt user if necessary,
2906 B<a> [I<line>] Delete the action for I<line>.
2907 B<A> Delete all actions.
2908 B<W> I<expr> Add a global watch-expression.
2909 B<W> Delete all watch-expressions.
2910 B<V> [I<pkg> [I<vars>]] List some (default all) variables in package (default current).
2911 Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps.
2912 B<X> [I<vars>] Same as \"B<V> I<currentpackage> [I<vars>]\".
2913 B<x> I<expr> Evals expression in list context, dumps the result.
2914 B<m> I<expr> Evals expression in list context, prints methods callable
2915 on the first element of the result.
2916 B<m> I<class> Prints methods callable via the given class.
2918 B<<> ? List Perl commands to run before each prompt.
2919 B<<> I<expr> Define Perl command to run before each prompt.
2920 B<<<> I<expr> Add to the list of Perl commands to run before each prompt.
2921 B<>> ? List Perl commands to run after each prompt.
2922 B<>> I<expr> Define Perl command to run after each prompt.
2923 B<>>B<>> I<expr> Add to the list of Perl commands to run after each prompt.
2924 B<{> I<db_command> Define debugger command to run before each prompt.
2925 B<{> ? List debugger commands to run before each prompt.
2926 B<{{> I<db_command> Add to the list of debugger commands to run before each prompt.
2927 B<$prc> I<number> Redo a previous command (default previous command).
2928 B<$prc> I<-number> Redo number'th-to-last command.
2929 B<$prc> I<pattern> Redo last command that started with I<pattern>.
2930 See 'B<O> I<recallCommand>' too.
2931 B<$psh$psh> I<cmd> Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)"
2932 . ( $rc eq $sh ? "" : "
2933 B<$psh> [I<cmd>] Run I<cmd> in subshell (forces \"\$SHELL -c 'cmd'\")." ) . "
2934 See 'B<O> I<shellBang>' too.
2935 B<source> I<file> Execute I<file> containing debugger commands (may nest).
2936 B<H> I<-number> Display last number commands (default all).
2937 B<p> I<expr> Same as \"I<print {DB::OUT} expr>\" in current package.
2938 B<|>I<dbcmd> Run debugger command, piping DB::OUT to current pager.
2939 B<||>I<dbcmd> Same as B<|>I<dbcmd> but DB::OUT is temporarilly select()ed as well.
2940 B<\=> [I<alias> I<value>] Define a command alias, or list current aliases.
2941 I<command> Execute as a perl statement in current package.
2942 B<v> Show versions of loaded modules.
2943 B<R> Pure-man-restart of debugger, some of debugger state
2944 and command-line options may be lost.
2945 Currently the following settings are preserved:
2946 history, breakpoints and actions, debugger B<O>ptions
2947 and the following command-line options: I<-w>, I<-I>, I<-e>.
2949 B<O> [I<opt>] ... Set boolean option to true
2950 B<O> [I<opt>B<?>] Query options
2951 B<O> [I<opt>B<=>I<val>] [I<opt>=B<\">I<val>B<\">] ...
2952 Set options. Use quotes in spaces in value.
2953 I<recallCommand>, I<ShellBang> chars used to recall command or spawn shell;
2954 I<pager> program for output of \"|cmd\";
2955 I<tkRunning> run Tk while prompting (with ReadLine);
2956 I<signalLevel> I<warnLevel> I<dieLevel> level of verbosity;
2957 I<inhibit_exit> Allows stepping off the end of the script.
2958 I<ImmediateStop> Debugger should stop as early as possible.
2959 I<RemotePort> Remote hostname:port for remote debugging
2960 The following options affect what happens with B<V>, B<X>, and B<x> commands:
2961 I<arrayDepth>, I<hashDepth> print only first N elements ('' for all);
2962 I<compactDump>, I<veryCompact> change style of array and hash dump;
2963 I<globPrint> whether to print contents of globs;
2964 I<DumpDBFiles> dump arrays holding debugged files;
2965 I<DumpPackages> dump symbol tables of packages;
2966 I<DumpReused> dump contents of \"reused\" addresses;
2967 I<quote>, I<HighBit>, I<undefPrint> change style of string dump;
2968 I<bareStringify> Do not print the overload-stringified value;
2969 Other options include:
2970 I<PrintRet> affects printing of return value after B<r> command,
2971 I<frame> affects printing messages on subroutine entry/exit.
2972 I<AutoTrace> affects printing messages on possible breaking points.
2973 I<maxTraceLen> gives max length of evals/args listed in stack trace.
2974 I<ornaments> affects screen appearance of the command line.
2975 I<CreateTTY> bits control attempts to create a new TTY on events:
2976 1: on fork() 2: debugger is started inside debugger
2978 During startup options are initialized from \$ENV{PERLDB_OPTS}.
2979 You can put additional initialization options I<TTY>, I<noTTY>,
2980 I<ReadLine>, I<NonStop>, and I<RemotePort> there (or use
2981 `B<R>' after you set them).
2983 B<q> or B<^D> Quit. Set B<\$DB::finished = 0> to debug global destruction.
2984 B<h> [I<db_command>] Get help [on a specific debugger command], enter B<|h> to page.
2985 B<h h> Summary of debugger commands.
2986 B<$doccmd> I<manpage> Runs the external doc viewer B<$doccmd> command on the
2987 named Perl I<manpage>, or on B<$doccmd> itself if omitted.
2988 Set B<\$DB::doccmd> to change viewer.
2990 Type `|h' for a paged display if this was too hard to read.
2992 "; # Fix balance of vi % matching: }}}}
2994 # note: tabs in the following section are not-so-helpful
2995 $pre580_summary = <<"END_SUM";
2996 I<List/search source lines:> I<Control script execution:>
2997 B<l> [I<ln>|I<sub>] List source code B<T> Stack trace
2998 B<-> or B<.> List previous/current line B<s> [I<expr>] Single step [in expr]
2999 B<w> [I<line>] List around line B<n> [I<expr>] Next, steps over subs
3000 B<f> I<filename> View source in file <B<CR>/B<Enter>> Repeat last B<n> or B<s>
3001 B</>I<pattern>B</> B<?>I<patt>B<?> Search forw/backw B<r> Return from subroutine
3002 B<v> Show versions of modules B<c> [I<ln>|I<sub>] Continue until position
3003 I<Debugger controls:> B<L> List break/watch/actions
3004 B<O> [...] Set debugger options B<t> [I<expr>] Toggle trace [trace expr]
3005 B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
3006 B<$prc> [I<N>|I<pat>] Redo a previous command B<d> [I<ln>] or B<D> Delete a/all breakpoints
3007 B<H> [I<-num>] Display last num commands B<a> [I<ln>] I<cmd> Do cmd before line
3008 B<=> [I<a> I<val>] Define/list an alias B<W> I<expr> Add a watch expression
3009 B<h> [I<db_cmd>] Get help on command B<A> or B<W> Delete all actions/watch
3010 B<|>[B<|>]I<db_cmd> Send output to pager B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess
3011 B<q> or B<^D> Quit B<R> Attempt a restart
3012 I<Data Examination:> B<expr> Execute perl code, also see: B<s>,B<n>,B<t> I<expr>
3013 B<x>|B<m> I<expr> Evals expr in list context, dumps the result or lists methods.
3014 B<p> I<expr> Print expression (uses script's current package).
3015 B<S> [[B<!>]I<pat>] List subroutine names [not] matching pattern
3016 B<V> [I<Pk> [I<Vars>]] List Variables in Package. Vars can be ~pattern or !pattern.
3017 B<X> [I<Vars>] Same as \"B<V> I<current_package> [I<Vars>]\".
3018 B<y> [I<n> [I<Vars>]] List lexicals in higher scope <n>. Vars same as B<V>.
3019 For more help, type B<h> I<cmd_letter>, or run B<$doccmd perldebug> for all docs.
3021 # ')}}; # Fix balance of vi % matching
3028 # Restore proper alignment destroyed by eeevil I<> and B<>
3029 # ornaments: A pox on both their houses!
3031 # A help command will have everything up to and including
3032 # the first tab sequence padded into a field 16 (or if indented 20)
3033 # wide. If it's wider than that, an extra space will be added.
3035 ^ # only matters at start of line
3036 ( \040{4} | \t )* # some subcommands are indented
3037 ( < ? # so <CR> works
3038 [BI] < [^\t\n] + ) # find an eeevil ornament
3039 ( \t+ ) # original separation, discarded
3040 ( .* ) # this will now start (no earlier) than
3043 my($leadwhite, $command, $midwhite, $text) = ($1, $2, $3, $4);
3044 my $clean = $command;
3045 $clean =~ s/[BI]<([^>]*)>/$1/g;
3046 # replace with this whole string:
3047 ($leadwhite ? " " x 4 : "")
3049 . ((" " x (16 + ($leadwhite ? 4 : 0) - length($clean))) || " ")
3054 s{ # handle bold ornaments
3055 B < ( [^>] + | > ) >
3057 $Term::ReadLine::TermCap::rl_term_set[2]
3059 . $Term::ReadLine::TermCap::rl_term_set[3]
3062 s{ # handle italic ornaments
3063 I < ( [^>] + | > ) >
3065 $Term::ReadLine::TermCap::rl_term_set[0]
3067 . $Term::ReadLine::TermCap::rl_term_set[1]
3075 return if defined $ENV{LESS} && $ENV{LESS} =~ /r/;
3076 my $is_less = $pager =~ /\bless\b/;
3077 if ($pager =~ /\bmore\b/) {
3078 my @st_more = stat('/usr/bin/more');
3079 my @st_less = stat('/usr/bin/less');
3080 $is_less = @st_more && @st_less
3081 && $st_more[0] == $st_less[0]
3082 && $st_more[1] == $st_less[1];
3084 # changes environment!
3085 $ENV{LESS} .= 'r' if $is_less;
3091 $SIG{'ABRT'} = 'DEFAULT';
3092 kill 'ABRT', $$ if $panic++;
3093 if (defined &Carp::longmess) {
3094 local $SIG{__WARN__} = '';
3095 local $Carp::CarpLevel = 2; # mydie + confess
3096 &warn(Carp::longmess("Signal @_"));
3100 print $DB::OUT "Got signal @_\n";
3108 local $SIG{__WARN__} = '';
3109 local $SIG{__DIE__} = '';
3110 eval { require Carp } if defined $^S; # If error/warning during compilation,
3111 # require may be broken.
3112 CORE::warn(@_, "\nCannot print stack trace, load with -MCarp option to see stack"),
3113 return unless defined &Carp::longmess;
3114 my ($mysingle,$mytrace) = ($single,$trace);
3115 $single = 0; $trace = 0;
3116 my $mess = Carp::longmess(@_);
3117 ($single,$trace) = ($mysingle,$mytrace);
3124 local $SIG{__DIE__} = '';
3125 local $SIG{__WARN__} = '';
3126 my $i = 0; my $ineval = 0; my $sub;
3127 if ($dieLevel > 2) {
3128 local $SIG{__WARN__} = \&dbwarn;
3129 &warn(@_); # Yell no matter what
3132 if ($dieLevel < 2) {
3133 die @_ if $^S; # in eval propagate
3135 # No need to check $^S, eval is much more robust nowadays
3136 eval { require Carp }; #if defined $^S;# If error/warning during compilation,
3137 # require may be broken.
3139 die(@_, "\nCannot print stack trace, load with -MCarp option to see stack")
3140 unless defined &Carp::longmess;
3142 # We do not want to debug this chunk (automatic disabling works
3143 # inside DB::DB, but not in Carp).
3144 my ($mysingle,$mytrace) = ($single,$trace);
3145 $single = 0; $trace = 0;
3148 package Carp; # Do not include us in the list
3150 $mess = Carp::longmess(@_);
3153 ($single,$trace) = ($mysingle,$mytrace);
3159 $prevwarn = $SIG{__WARN__} unless $warnLevel;
3162 $SIG{__WARN__} = \&DB::dbwarn;
3163 } elsif ($prevwarn) {
3164 $SIG{__WARN__} = $prevwarn;
3173 $prevdie = $SIG{__DIE__} unless $dieLevel;
3176 $SIG{__DIE__} = \&DB::dbdie; # if $dieLevel < 2;
3177 #$SIG{__DIE__} = \&DB::diehard if $dieLevel >= 2;
3178 print $OUT "Stack dump during die enabled",
3179 ( $dieLevel == 1 ? " outside of evals" : ""), ".\n"
3181 print $OUT "Dump printed too.\n" if $dieLevel > 2;
3182 } elsif ($prevdie) {
3183 $SIG{__DIE__} = $prevdie;
3184 print $OUT "Default die handler restored.\n";
3192 $prevsegv = $SIG{SEGV} unless $signalLevel;
3193 $prevbus = $SIG{BUS} unless $signalLevel;
3194 $signalLevel = shift;
3196 $SIG{SEGV} = \&DB::diesignal;
3197 $SIG{BUS} = \&DB::diesignal;
3199 $SIG{SEGV} = $prevsegv;
3200 $SIG{BUS} = $prevbus;
3208 my $name = CvGV_name_or_bust($in);
3209 defined $name ? $name : $in;
3212 sub CvGV_name_or_bust {
3214 return if $skipCvGV; # Backdoor to avoid problems if XS broken...
3215 return unless ref $in;
3216 $in = \&$in; # Hard reference...
3217 eval {require Devel::Peek; 1} or return;
3218 my $gv = Devel::Peek::CvGV($in) or return;
3219 *$gv{PACKAGE} . '::' . *$gv{NAME};
3225 return unless defined &$subr;
3226 my $name = CvGV_name_or_bust($subr);
3228 $data = $sub{$name} if defined $name;
3229 return $data if defined $data;
3232 $subr = \&$subr; # Hard reference
3235 $s = $_, last if $subr eq \&$_;
3243 $class = ref $class if ref $class;
3246 methods_via($class, '', 1);
3247 methods_via('UNIVERSAL', 'UNIVERSAL', 0);
3252 return if $packs{$class}++;
3254 my $prepend = $prefix ? "via $prefix: " : '';
3256 for $name (grep {defined &{${"${class}::"}{$_}}}
3257 sort keys %{"${class}::"}) {
3258 next if $seen{ $name }++;
3261 print $DB::OUT "$prepend$name\n";
3263 return unless shift; # Recurse?
3264 for $name (@{"${class}::ISA"}) {
3265 $prepend = $prefix ? $prefix . " -> $name" : $name;
3266 methods_via($name, $prepend, 1);
3271 $doccmd = $^O !~ /^(?:MSWin32|VMS|os2|dos|amigaos|riscos|MacOS|NetWare)\z/s
3272 ? "man" # O Happy Day!
3273 : "perldoc"; # Alas, poor unfortunates
3279 &system("$doccmd $doccmd");
3282 # this way user can override, like with $doccmd="man -Mwhatever"
3283 # or even just "man " to disable the path check.
3284 unless ($doccmd eq 'man') {
3285 &system("$doccmd $page");
3289 $page = 'perl' if lc($page) eq 'help';
3292 my $man1dir = $Config::Config{'man1dir'};
3293 my $man3dir = $Config::Config{'man3dir'};
3294 for ($man1dir, $man3dir) { s#/[^/]*\z## if /\S/ }
3296 $manpath .= "$man1dir:" if $man1dir =~ /\S/;
3297 $manpath .= "$man3dir:" if $man3dir =~ /\S/ && $man1dir ne $man3dir;
3298 chop $manpath if $manpath;
3299 # harmless if missing, I figure
3300 my $oldpath = $ENV{MANPATH};
3301 $ENV{MANPATH} = $manpath if $manpath;
3302 my $nopathopt = $^O =~ /dunno what goes here/;
3303 if (CORE::system($doccmd,
3304 # I just *know* there are men without -M
3305 (($manpath && !$nopathopt) ? ("-M", $manpath) : ()),
3308 unless ($page =~ /^perl\w/) {
3309 if (grep { $page eq $_ } qw{
3310 5004delta 5005delta amiga api apio book boot bot call compile
3311 cygwin data dbmfilter debug debguts delta diag doc dos dsc embed
3312 faq faq1 faq2 faq3 faq4 faq5 faq6 faq7 faq8 faq9 filter fork
3313 form func guts hack hist hpux intern ipc lexwarn locale lol mod
3314 modinstall modlib number obj op opentut os2 os390 pod port
3315 ref reftut run sec style sub syn thrtut tie toc todo toot tootc
3316 trap unicode var vms win32 xs xstut
3320 CORE::system($doccmd,
3321 (($manpath && !$nopathopt) ? ("-M", $manpath) : ()),
3326 if (defined $oldpath) {
3327 $ENV{MANPATH} = $manpath;
3329 delete $ENV{MANPATH};
3333 # The following BEGIN is very handy if debugger goes havoc, debugging debugger?
3335 BEGIN { # This does not compile, alas.
3336 $IN = \*STDIN; # For bugs before DB::OUT has been opened
3337 $OUT = \*STDERR; # For errors before DB::OUT has been opened
3341 $deep = 100; # warning if stack gets this deep
3345 $SIG{INT} = \&DB::catch;
3346 # This may be enabled to debug debugger:
3347 #$warnLevel = 1 unless defined $warnLevel;
3348 #$dieLevel = 1 unless defined $dieLevel;
3349 #$signalLevel = 1 unless defined $signalLevel;
3351 $db_stop = 0; # Compiler warning
3353 $level = 0; # Level of recursive debugging
3354 # @stack and $doret are needed in sub sub, which is called for DB::postponed.
3355 # Triggers bug (?) in perl is we postpone this until runtime:
3356 @postponed = @stack = (0);
3357 $stack_depth = 0; # Localized $#stack
3362 BEGIN {$^W = $ini_warn;} # Switch warnings back
3364 #use Carp; # This did break, left for debugging
3367 # Specific code for b c l V m f O, &blah, $blah, @blah, %blah
3368 my($text, $line, $start) = @_;
3369 my ($itext, $search, $prefix, $pack) =
3370 ($text, "^\Q${'package'}::\E([^:]+)\$");
3372 return sort grep /^\Q$text/, (keys %sub), qw(postpone load compile), # subroutines
3373 (map { /$search/ ? ($1) : () } keys %sub)
3374 if (substr $line, 0, $start) =~ /^\|*[blc]\s+((postpone|compile)\s+)?$/;
3375 return sort grep /^\Q$text/, values %INC # files
3376 if (substr $line, 0, $start) =~ /^\|*b\s+load\s+$/;
3377 return sort map {($_, db_complete($_ . "::", "V ", 2))}
3378 grep /^\Q$text/, map { /^(.*)::$/ ? ($1) : ()} keys %:: # top-packages
3379 if (substr $line, 0, $start) =~ /^\|*[Vm]\s+$/ and $text =~ /^\w*$/;
3380 return sort map {($_, db_complete($_ . "::", "V ", 2))}
3382 grep /^\Q$text/, map { /^(.*)::$/ ? ($prefix . "::$1") : ()} keys %{$prefix . '::'}
3384 if (substr $line, 0, $start) =~ /^\|*[Vm]\s+$/
3385 and $text =~ /^(.*[^:])::?(\w*)$/ and $prefix = $1;
3386 if ( $line =~ /^\|*f\s+(.*)/ ) { # Loaded files
3387 # We may want to complete to (eval 9), so $text may be wrong
3388 $prefix = length($1) - length($text);
3391 map {substr $_, 2 + $prefix} grep /^_<\Q$text/, (keys %main::), $0
3393 if ((substr $text, 0, 1) eq '&') { # subroutines
3394 $text = substr $text, 1;
3396 return sort map "$prefix$_",
3399 (map { /$search/ ? ($1) : () }
3402 if ($text =~ /^[\$@%](.*)::(.*)/) { # symbols in a package
3403 $pack = ($1 eq 'main' ? '' : $1) . '::';
3404 $prefix = (substr $text, 0, 1) . $1 . '::';
3407 = map "$prefix$_", grep /^\Q$text/, grep /^_?[a-zA-Z]/, keys %$pack ;
3408 if (@out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext) {
3409 return db_complete($out[0], $line, $start);
3413 if ($text =~ /^[\$@%]/) { # symbols (in $package + packages in main)
3414 $pack = ($package eq 'main' ? '' : $package) . '::';
3415 $prefix = substr $text, 0, 1;
3416 $text = substr $text, 1;
3417 my @out = map "$prefix$_", grep /^\Q$text/,
3418 (grep /^_?[a-zA-Z]/, keys %$pack),
3419 ( $pack eq '::' ? () : (grep /::$/, keys %::) ) ;
3420 if (@out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext) {
3421 return db_complete($out[0], $line, $start);
3425 if ((substr $line, 0, $start) =~ /^\|*O\b.*\s$/) { # Options after a space
3426 my @out = grep /^\Q$text/, @options;
3427 my $val = option_val($out[0], undef);
3429 if (not defined $val or $val =~ /[\n\r]/) {
3430 # Can do nothing better
3431 } elsif ($val =~ /\s/) {
3433 foreach $l (split //, qq/\"\'\#\|/) {
3434 $out = "$l$val$l ", last if (index $val, $l) == -1;
3439 # Default to value if one completion, to question if many
3440 $rl_attribs->{completer_terminator_character} = (@out == 1 ? $out : '? ');
3443 return $term->filename_list($text); # filenames
3448 print $OUT "Use `q' to quit or `R' to restart. `h q' for details.\n"
3452 if (defined($ini_pids)) {
3453 $ENV{PERLDB_PIDS} = $ini_pids;
3455 delete($ENV{PERLDB_PIDS});
3460 $finished = 1 if $inhibit_exit; # So that some keys may be disabled.
3461 $fall_off_end = 1 unless $inhibit_exit;
3462 # Do not stop in at_exit() and destructors on exit:
3463 $DB::single = !$fall_off_end && !$runnonstop;
3464 DB::fake::at_exit() unless $fall_off_end or $runnonstop;
3468 # ===================================== pre580 ================================
3469 # this is very sad below here...
3472 sub cmd_pre580_null {
3478 if ($cmd =~ /^(\d*)\s*(.*)/) {
3479 $i = $1 || $line; $j = $2;
3481 if ($dbline[$i] == 0) {
3482 print $OUT "Line $i may not have an action.\n";
3484 $had_breakpoints{$filename} |= 2;
3485 $dbline{$i} =~ s/\0[^\0]*//;
3486 $dbline{$i} .= "\0" . action($j);
3489 $dbline{$i} =~ s/\0[^\0]*//;
3490 delete $dbline{$i} if $dbline{$i} eq '';
3498 if ($cmd =~ /^load\b\s*(.*)/) {
3499 my $file = $1; $file =~ s/\s+$//;
3501 } elsif ($cmd =~ /^(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/) {
3502 my $cond = length $3 ? $3 : '1';
3503 my ($subname, $break) = ($2, $1 eq 'postpone');
3504 $subname =~ s/\'/::/g;
3505 $subname = "${'package'}::" . $subname
3506 unless $subname =~ /::/;
3507 $subname = "main".$subname if substr($subname,0,2) eq "::";
3508 $postponed{$subname} = $break ? "break +0 if $cond" : "compile";
3509 } elsif ($cmd =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/) {
3511 my $cond = length $2 ? $2 : '1';
3512 &cmd_b_sub($subname, $cond);
3513 } elsif ($cmd =~ /^(\d*)\s*(.*)/) {
3514 my $i = $1 || $dbline;
3515 my $cond = length $2 ? $2 : '1';
3516 &cmd_b_line($i, $cond);
3522 if ($cmd =~ /^\s*$/) {
3523 print $OUT "Deleting all breakpoints...\n";
3525 for $file (keys %had_breakpoints) {
3526 local *dbline = $main::{'_<' . $file};
3530 for ($i = 1; $i <= $max ; $i++) {
3531 if (defined $dbline{$i}) {
3532 $dbline{$i} =~ s/^[^\0]+//;
3533 if ($dbline{$i} =~ s/^\0?$//) {
3539 if (not $had_breakpoints{$file} &= ~1) {
3540 delete $had_breakpoints{$file};
3544 undef %postponed_file;
3545 undef %break_on_load;
3551 if ($cmd =~ /^\s*$/) {
3552 print_help($pre580_help);
3553 } elsif ($cmd =~ /^h\s*/) {
3554 print_help($pre580_summary);
3555 } elsif ($cmd =~ /^h\s+(\S.*)$/) {
3556 my $asked = $1; # for proper errmsg
3557 my $qasked = quotemeta($asked); # for searching
3558 # XXX: finds CR but not <CR>
3559 if ($pre580_help =~ /^<?(?:[IB]<)$qasked/m) {
3560 while ($pre580_help =~ /^(<?(?:[IB]<)$qasked([\s\S]*?)\n)(?!\s)/mg) {
3564 print_help("B<$asked> is not a debugger command.\n");
3573 @to_watch = @old_watch = ();
3574 } elsif ($cmd =~ /^(.*)/s) {
3578 $val = (defined $val) ? "'$val'" : 'undef' ;
3579 push @old_watch, $val;
3587 "Debugged program terminated. Use `q' to quit or `R' to restart.";
3590 package DB; # Do not trace this 1; below!