xref: /openbsd/gnu/usr.bin/perl/lib/perl5db.pl (revision 5a38ef86)
1
2=head1 NAME
3
4perl5db.pl - the perl debugger
5
6=head1 SYNOPSIS
7
8    perl -d  your_Perl_script
9
10=head1 DESCRIPTION
11
12C<perl5db.pl> is the perl debugger. It is loaded automatically by Perl when
13you invoke a script with C<perl -d>. This documentation tries to outline the
14structure and services provided by C<perl5db.pl>, and to describe how you
15can use them.
16
17=head1 GENERAL NOTES
18
19The debugger can look pretty forbidding to many Perl programmers. There are
20a number of reasons for this, many stemming out of the debugger's history.
21
22When the debugger was first written, Perl didn't have a lot of its nicer
23features - no references, no lexical variables, no closures, no object-oriented
24programming. So a lot of the things one would normally have done using such
25features was done using global variables, globs and the C<local()> operator
26in creative ways.
27
28Some of these have survived into the current debugger; a few of the more
29interesting and still-useful idioms are noted in this section, along with notes
30on the comments themselves.
31
32=head2 Why not use more lexicals?
33
34Experienced Perl programmers will note that the debugger code tends to use
35mostly package globals rather than lexically-scoped variables. This is done
36to allow a significant amount of control of the debugger from outside the
37debugger itself.
38
39Unfortunately, though the variables are accessible, they're not well
40documented, so it's generally been a decision that hasn't made a lot of
41difference to most users. Where appropriate, comments have been added to
42make variables more accessible and usable, with the understanding that these
43I<are> debugger internals, and are therefore subject to change. Future
44development should probably attempt to replace the globals with a well-defined
45API, but for now, the variables are what we've got.
46
47=head2 Automated variable stacking via C<local()>
48
49As you may recall from reading C<perlfunc>, the C<local()> operator makes a
50temporary copy of a variable in the current scope. When the scope ends, the
51old copy is restored. This is often used in the debugger to handle the
52automatic stacking of variables during recursive calls:
53
54     sub foo {
55        local $some_global++;
56
57        # Do some stuff, then ...
58        return;
59     }
60
61What happens is that on entry to the subroutine, C<$some_global> is localized,
62then altered. When the subroutine returns, Perl automatically undoes the
63localization, restoring the previous value. Voila, automatic stack management.
64
65The debugger uses this trick a I<lot>. Of particular note is C<DB::eval>,
66which lets the debugger get control inside of C<eval>'ed code. The debugger
67localizes a saved copy of C<$@> inside the subroutine, which allows it to
68keep C<$@> safe until it C<DB::eval> returns, at which point the previous
69value of C<$@> is restored. This makes it simple (well, I<simpler>) to keep
70track of C<$@> inside C<eval>s which C<eval> other C<eval's>.
71
72In any case, watch for this pattern. It occurs fairly often.
73
74=head2 The C<^> trick
75
76This is used to cleverly reverse the sense of a logical test depending on
77the value of an auxiliary variable. For instance, the debugger's C<S>
78(search for subroutines by pattern) allows you to negate the pattern
79like this:
80
81   # Find all non-'foo' subs:
82   S !/foo/
83
84Boolean algebra states that the truth table for XOR looks like this:
85
86=over 4
87
88=item * 0 ^ 0 = 0
89
90(! not present and no match) --> false, don't print
91
92=item * 0 ^ 1 = 1
93
94(! not present and matches) --> true, print
95
96=item * 1 ^ 0 = 1
97
98(! present and no match) --> true, print
99
100=item * 1 ^ 1 = 0
101
102(! present and matches) --> false, don't print
103
104=back
105
106As you can see, the first pair applies when C<!> isn't supplied, and
107the second pair applies when it is. The XOR simply allows us to
108compact a more complicated if-then-elseif-else into a more elegant
109(but perhaps overly clever) single test. After all, it needed this
110explanation...
111
112=head2 FLAGS, FLAGS, FLAGS
113
114There is a certain C programming legacy in the debugger. Some variables,
115such as C<$single>, C<$trace>, and C<$frame>, have I<magical> values composed
116of 1, 2, 4, etc. (powers of 2) OR'ed together. This allows several pieces
117of state to be stored independently in a single scalar.
118
119A test like
120
121    if ($scalar & 4) ...
122
123is checking to see if the appropriate bit is on. Since each bit can be
124"addressed" independently in this way, C<$scalar> is acting sort of like
125an array of bits. Obviously, since the contents of C<$scalar> are just a
126bit-pattern, we can save and restore it easily (it will just look like
127a number).
128
129The problem, is of course, that this tends to leave magic numbers scattered
130all over your program whenever a bit is set, cleared, or checked. So why do
131it?
132
133=over 4
134
135=item *
136
137First, doing an arithmetical or bitwise operation on a scalar is
138just about the fastest thing you can do in Perl: C<use constant> actually
139creates a subroutine call, and array and hash lookups are much slower. Is
140this over-optimization at the expense of readability? Possibly, but the
141debugger accesses these  variables a I<lot>. Any rewrite of the code will
142probably have to benchmark alternate implementations and see which is the
143best balance of readability and speed, and then document how it actually
144works.
145
146=item *
147
148Second, it's very easy to serialize a scalar number. This is done in
149the restart code; the debugger state variables are saved in C<%ENV> and then
150restored when the debugger is restarted. Having them be just numbers makes
151this trivial.
152
153=item *
154
155Third, some of these variables are being shared with the Perl core
156smack in the middle of the interpreter's execution loop. It's much faster for
157a C program (like the interpreter) to check a bit in a scalar than to access
158several different variables (or a Perl array).
159
160=back
161
162=head2 What are those C<XXX> comments for?
163
164Any comment containing C<XXX> means that the comment is either somewhat
165speculative - it's not exactly clear what a given variable or chunk of
166code is doing, or that it is incomplete - the basics may be clear, but the
167subtleties are not completely documented.
168
169Send in a patch if you can clear up, fill out, or clarify an C<XXX>.
170
171=head1 DATA STRUCTURES MAINTAINED BY CORE
172
173There are a number of special data structures provided to the debugger by
174the Perl interpreter.
175
176The array C<@{$main::{'_<'.$filename}}> (aliased locally to C<@dbline>
177via glob assignment) contains the text from C<$filename>, with each
178element corresponding to a single line of C<$filename>. Additionally,
179breakable lines will be dualvars with the numeric component being the
180memory address of a COP node. Non-breakable lines are dualvar to 0.
181
182The hash C<%{'_<'.$filename}> (aliased locally to C<%dbline> via glob
183assignment) contains breakpoints and actions.  The keys are line numbers;
184you can set individual values, but not the whole hash. The Perl interpreter
185uses this hash to determine where breakpoints have been set. Any true value is
186considered to be a breakpoint; C<perl5db.pl> uses C<$break_condition\0$action>.
187Values are magical in numeric context: 1 if the line is breakable, 0 if not.
188
189The scalar C<${"_<$filename"}> simply contains the string C<$filename>.
190This is also the case for evaluated strings that contain subroutines, or
191which are currently being executed.  The $filename for C<eval>ed strings looks
192like C<(eval 34)>.
193
194=head1 DEBUGGER STARTUP
195
196When C<perl5db.pl> starts, it reads an rcfile (C<perl5db.ini> for
197non-interactive sessions, C<.perldb> for interactive ones) that can set a number
198of options. In addition, this file may define a subroutine C<&afterinit>
199that will be executed (in the debugger's context) after the debugger has
200initialized itself.
201
202Next, it checks the C<PERLDB_OPTS> environment variable and treats its
203contents as the argument of a C<o> command in the debugger.
204
205=head2 STARTUP-ONLY OPTIONS
206
207The following options can only be specified at startup.
208To set them in your rcfile, add a call to
209C<&parse_options("optionName=new_value")>.
210
211=over 4
212
213=item * TTY
214
215the TTY to use for debugging i/o.
216
217=item * noTTY
218
219if set, goes in NonStop mode.  On interrupt, if TTY is not set,
220uses the value of noTTY or F<$HOME/.perldbtty$$> to find TTY using
221Term::Rendezvous.  Current variant is to have the name of TTY in this
222file.
223
224=item * ReadLine
225
226if false, a dummy ReadLine is used, so you can debug
227ReadLine applications.
228
229=item * NonStop
230
231if true, no i/o is performed until interrupt.
232
233=item * LineInfo
234
235file or pipe to print line number info to.  If it is a
236pipe, a short "emacs like" message is used.
237
238=item * RemotePort
239
240host:port to connect to on remote host for remote debugging.
241
242=item * HistFile
243
244file to store session history to. There is no default and so no
245history file is written unless this variable is explicitly set.
246
247=item * HistSize
248
249number of commands to store to the file specified in C<HistFile>.
250Default is 100.
251
252=back
253
254=head3 SAMPLE RCFILE
255
256 &parse_options("NonStop=1 LineInfo=db.out");
257  sub afterinit { $trace = 1; }
258
259The script will run without human intervention, putting trace
260information into C<db.out>.  (If you interrupt it, you had better
261reset C<LineInfo> to something I<interactive>!)
262
263=head1 INTERNALS DESCRIPTION
264
265=head2 DEBUGGER INTERFACE VARIABLES
266
267Perl supplies the values for C<%sub>.  It effectively inserts
268a C<&DB::DB();> in front of each place that can have a
269breakpoint. At each subroutine call, it calls C<&DB::sub> with
270C<$DB::sub> set to the called subroutine. It also inserts a C<BEGIN
271{require 'perl5db.pl'}> before the first line.
272
273After each C<require>d file is compiled, but before it is executed, a
274call to C<&DB::postponed($main::{'_<'.$filename})> is done. C<$filename>
275is the expanded name of the C<require>d file (as found via C<%INC>).
276
277=head3 IMPORTANT INTERNAL VARIABLES
278
279=head4 C<$CreateTTY>
280
281Used to control when the debugger will attempt to acquire another TTY to be
282used for input.
283
284=over
285
286=item * 1 -  on C<fork()>
287
288=item * 2 - debugger is started inside debugger
289
290=item * 4 -  on startup
291
292=back
293
294=head4 C<$doret>
295
296The value -2 indicates that no return value should be printed.
297Any other positive value causes C<DB::sub> to print return values.
298
299=head4 C<$evalarg>
300
301The item to be eval'ed by C<DB::eval>. Used to prevent messing with the current
302contents of C<@_> when C<DB::eval> is called.
303
304=head4 C<$frame>
305
306Determines what messages (if any) will get printed when a subroutine (or eval)
307is entered or exited.
308
309=over 4
310
311=item * 0 -  No enter/exit messages
312
313=item * 1 - Print I<entering> messages on subroutine entry
314
315=item * 2 - Adds exit messages on subroutine exit. If no other flag is on, acts like 1+2.
316
317=item * 4 - Extended messages: C<< <in|out> I<context>=I<fully-qualified sub name> from I<file>:I<line> >>. If no other flag is on, acts like 1+4.
318
319=item * 8 - Adds parameter information to messages, and overloaded stringify and tied FETCH is enabled on the printed arguments. Ignored if C<4> is not on.
320
321=item * 16 - Adds C<I<context> return from I<subname>: I<value>> messages on subroutine/eval exit. Ignored if C<4> is not on.
322
323=back
324
325To get everything, use C<$frame=30> (or C<o f=30> as a debugger command).
326The debugger internally juggles the value of C<$frame> during execution to
327protect external modules that the debugger uses from getting traced.
328
329=head4 C<$level>
330
331Tracks current debugger nesting level. Used to figure out how many
332C<E<lt>E<gt>> pairs to surround the line number with when the debugger
333outputs a prompt. Also used to help determine if the program has finished
334during command parsing.
335
336=head4 C<$onetimeDump>
337
338Controls what (if anything) C<DB::eval()> will print after evaluating an
339expression.
340
341=over 4
342
343=item * C<undef> - don't print anything
344
345=item * C<dump> - use C<dumpvar.pl> to display the value returned
346
347=item * C<methods> - print the methods callable on the first item returned
348
349=back
350
351=head4 C<$onetimeDumpDepth>
352
353Controls how far down C<dumpvar.pl> will go before printing C<...> while
354dumping a structure. Numeric. If C<undef>, print all levels.
355
356=head4 C<$signal>
357
358Used to track whether or not an C<INT> signal has been detected. C<DB::DB()>,
359which is called before every statement, checks this and puts the user into
360command mode if it finds C<$signal> set to a true value.
361
362=head4 C<$single>
363
364Controls behavior during single-stepping. Stacked in C<@stack> on entry to
365each subroutine; popped again at the end of each subroutine.
366
367=over 4
368
369=item * 0 - run continuously.
370
371=item * 1 - single-step, go into subs. The C<s> command.
372
373=item * 2 - single-step, don't go into subs. The C<n> command.
374
375=item * 4 - print current sub depth (turned on to force this when C<too much
376recursion> occurs.
377
378=back
379
380=head4 C<$trace>
381
382Controls the output of trace information.
383
384=over 4
385
386=item * 1 - The C<t> command was entered to turn on tracing (every line executed is printed)
387
388=item * 2 - watch expressions are active
389
390=item * 4 - user defined a C<watchfunction()> in C<afterinit()>
391
392=back
393
394=head4 C<$slave_editor>
395
3961 if C<LINEINFO> was directed to a pipe; 0 otherwise.
397
398=head4 C<@cmdfhs>
399
400Stack of filehandles that C<DB::readline()> will read commands from.
401Manipulated by the debugger's C<source> command and C<DB::readline()> itself.
402
403=head4 C<@dbline>
404
405Local alias to the magical line array, C<@{$main::{'_<'.$filename}}> ,
406supplied by the Perl interpreter to the debugger. Contains the source.
407
408=head4 C<@old_watch>
409
410Previous values of watch expressions. First set when the expression is
411entered; reset whenever the watch expression changes.
412
413=head4 C<@saved>
414
415Saves important globals (C<$@>, C<$!>, C<$^E>, C<$,>, C<$/>, C<$\>, C<$^W>)
416so that the debugger can substitute safe values while it's running, and
417restore them when it returns control.
418
419=head4 C<@stack>
420
421Saves the current value of C<$single> on entry to a subroutine.
422Manipulated by the C<c> command to turn off tracing in all subs above the
423current one.
424
425=head4 C<@to_watch>
426
427The 'watch' expressions: to be evaluated before each line is executed.
428
429=head4 C<@typeahead>
430
431The typeahead buffer, used by C<DB::readline>.
432
433=head4 C<%alias>
434
435Command aliases. Stored as character strings to be substituted for a command
436entered.
437
438=head4 C<%break_on_load>
439
440Keys are file names, values are 1 (break when this file is loaded) or undef
441(don't break when it is loaded).
442
443=head4 C<%dbline>
444
445Keys are line numbers, values are C<condition\0action>. If used in numeric
446context, values are 0 if not breakable, 1 if breakable, no matter what is
447in the actual hash entry.
448
449=head4 C<%had_breakpoints>
450
451Keys are file names; values are bitfields:
452
453=over 4
454
455=item * 1 - file has a breakpoint in it.
456
457=item * 2 - file has an action in it.
458
459=back
460
461A zero or undefined value means this file has neither.
462
463=head4 C<%option>
464
465Stores the debugger options. These are character string values.
466
467=head4 C<%postponed>
468
469Saves breakpoints for code that hasn't been compiled yet.
470Keys are subroutine names, values are:
471
472=over 4
473
474=item * C<compile> - break when this sub is compiled
475
476=item * C<< break +0 if <condition> >> - break (conditionally) at the start of this routine. The condition will be '1' if no condition was specified.
477
478=back
479
480=head4 C<%postponed_file>
481
482This hash keeps track of breakpoints that need to be set for files that have
483not yet been compiled. Keys are filenames; values are references to hashes.
484Each of these hashes is keyed by line number, and its values are breakpoint
485definitions (C<condition\0action>).
486
487=head1 DEBUGGER INITIALIZATION
488
489The debugger's initialization actually jumps all over the place inside this
490package. This is because there are several BEGIN blocks (which of course
491execute immediately) spread through the code. Why is that?
492
493The debugger needs to be able to change some things and set some things up
494before the debugger code is compiled; most notably, the C<$deep> variable that
495C<DB::sub> uses to tell when a program has recursed deeply. In addition, the
496debugger has to turn off warnings while the debugger code is compiled, but then
497restore them to their original setting before the program being debugged begins
498executing.
499
500The first C<BEGIN> block simply turns off warnings by saving the current
501setting of C<$^W> and then setting it to zero. The second one initializes
502the debugger variables that are needed before the debugger begins executing.
503The third one puts C<$^X> back to its former value.
504
505We'll detail the second C<BEGIN> block later; just remember that if you need
506to initialize something before the debugger starts really executing, that's
507where it has to go.
508
509=cut
510
511package DB;
512
513use strict;
514
515use Cwd ();
516
517my $_initial_cwd;
518
519BEGIN {eval 'use IO::Handle'}; # Needed for flush only? breaks under miniperl
520
521BEGIN {
522    require feature;
523    $^V =~ /^v(\d+\.\d+)/;
524    feature->import(":$1");
525    $_initial_cwd = Cwd::getcwd();
526}
527
528# Debugger for Perl 5.00x; perl5db.pl patch level:
529use vars qw($VERSION $header);
530
531# bump to X.XX in blead, only use X.XX_XX in maint
532$VERSION = '1.57';
533
534$header = "perl5db.pl version $VERSION";
535
536=head1 DEBUGGER ROUTINES
537
538=head2 C<DB::eval()>
539
540This function replaces straight C<eval()> inside the debugger; it simplifies
541the process of evaluating code in the user's context.
542
543The code to be evaluated is passed via the package global variable
544C<$DB::evalarg>; this is done to avoid fiddling with the contents of C<@_>.
545
546Before we do the C<eval()>, we preserve the current settings of C<$trace>,
547C<$single>, C<$^D> and C<$usercontext>.  The latter contains the
548preserved values of C<$@>, C<$!>, C<$^E>, C<$,>, C<$/>, C<$\>, C<$^W> and the
549user's current package, grabbed when C<DB::DB> got control.  This causes the
550proper context to be used when the eval is actually done.  Afterward, we
551restore C<$trace>, C<$single>, and C<$^D>.
552
553Next we need to handle C<$@> without getting confused. We save C<$@> in a
554local lexical, localize C<$saved[0]> (which is where C<save()> will put
555C<$@>), and then call C<save()> to capture C<$@>, C<$!>, C<$^E>, C<$,>,
556C<$/>, C<$\>, and C<$^W>) and set C<$,>, C<$/>, C<$\>, and C<$^W> to values
557considered sane by the debugger. If there was an C<eval()> error, we print
558it on the debugger's output. If C<$onetimedump> is defined, we call
559C<dumpit> if it's set to 'dump', or C<methods> if it's set to
560'methods'. Setting it to something else causes the debugger to do the eval
561but not print the result - handy if you want to do something else with it
562(the "watch expressions" code does this to get the value of the watch
563expression but not show it unless it matters).
564
565In any case, we then return the list of output from C<eval> to the caller,
566and unwinding restores the former version of C<$@> in C<@saved> as well
567(the localization of C<$saved[0]> goes away at the end of this scope).
568
569=head3 Parameters and variables influencing execution of DB::eval()
570
571C<DB::eval> isn't parameterized in the standard way; this is to keep the
572debugger's calls to C<DB::eval()> from mucking with C<@_>, among other things.
573The variables listed below influence C<DB::eval()>'s execution directly.
574
575=over 4
576
577=item C<$evalarg> - the thing to actually be eval'ed
578
579=item C<$trace> - Current state of execution tracing
580
581=item C<$single> - Current state of single-stepping
582
583=item C<$onetimeDump> - what is to be displayed after the evaluation
584
585=item C<$onetimeDumpDepth> - how deep C<dumpit()> should go when dumping results
586
587=back
588
589The following variables are altered by C<DB::eval()> during its execution. They
590are "stacked" via C<local()>, enabling recursive calls to C<DB::eval()>.
591
592=over 4
593
594=item C<@res> - used to capture output from actual C<eval>.
595
596=item C<$otrace> - saved value of C<$trace>.
597
598=item C<$osingle> - saved value of C<$single>.
599
600=item C<$od> - saved value of C<$^D>.
601
602=item C<$saved[0]> - saved value of C<$@>.
603
604=item $\ - for output of C<$@> if there is an evaluation error.
605
606=back
607
608=head3 The problem of lexicals
609
610The context of C<DB::eval()> presents us with some problems. Obviously,
611we want to be 'sandboxed' away from the debugger's internals when we do
612the eval, but we need some way to control how punctuation variables and
613debugger globals are used.
614
615We can't use local, because the code inside C<DB::eval> can see localized
616variables; and we can't use C<my> either for the same reason. The code
617in this routine compromises and uses C<my>.
618
619After this routine is over, we don't have user code executing in the debugger's
620context, so we can use C<my> freely.
621
622=cut
623
624############################################## Begin lexical danger zone
625
626# 'my' variables used here could leak into (that is, be visible in)
627# the context that the code being evaluated is executing in. This means that
628# the code could modify the debugger's variables.
629#
630# Fiddling with the debugger's context could be Bad. We insulate things as
631# much as we can.
632
633use vars qw(
634    @args
635    %break_on_load
636    $CommandSet
637    $CreateTTY
638    $DBGR
639    @dbline
640    $dbline
641    %dbline
642    $dieLevel
643    $filename
644    $histfile
645    $histsize
646    $IN
647    $inhibit_exit
648    @ini_INC
649    $ini_warn
650    $maxtrace
651    $od
652    @options
653    $osingle
654    $otrace
655    $pager
656    $post
657    %postponed
658    $prc
659    $pre
660    $pretype
661    $psh
662    @RememberOnROptions
663    $remoteport
664    @res
665    $rl
666    @saved
667    $signalLevel
668    $sub
669    $term
670    $usercontext
671    $warnLevel
672);
673
674our (
675    @cmdfhs,
676    $evalarg,
677    $frame,
678    $hist,
679    $ImmediateStop,
680    $line,
681    $onetimeDump,
682    $onetimedumpDepth,
683    %option,
684    $OUT,
685    $packname,
686    $signal,
687    $single,
688    $start,
689    %sub,
690    $subname,
691    $trace,
692    $window,
693);
694
695# Used to save @ARGV and extract any debugger-related flags.
696use vars qw(@ARGS);
697
698# Used to prevent multiple entries to diesignal()
699# (if for instance diesignal() itself dies)
700use vars qw($panic);
701
702# Used to prevent the debugger from running nonstop
703# after a restart
704our ($second_time);
705
706sub _calc_usercontext {
707    my ($package) = @_;
708
709    # Cancel strict completely for the evaluated code, so the code
710    # the user evaluates won't be affected by it. (Shlomi Fish)
711    return 'no strict; ($@, $!, $^E, $,, $/, $\, $^W) = @DB::saved;'
712    . "package $package;";    # this won't let them modify, alas
713}
714
715sub eval {
716
717    # 'my' would make it visible from user code
718    #    but so does local! --tchrist
719    # Remember: this localizes @DB::res, not @main::res.
720    local @res;
721    {
722
723        # Try to keep the user code from messing  with us. Save these so that
724        # even if the eval'ed code changes them, we can put them back again.
725        # Needed because the user could refer directly to the debugger's
726        # package globals (and any 'my' variables in this containing scope)
727        # inside the eval(), and we want to try to stay safe.
728        local $otrace  = $trace;
729        local $osingle = $single;
730        local $od      = $^D;
731
732        # Untaint the incoming eval() argument.
733        { ($evalarg) = $evalarg =~ /(.*)/s; }
734
735        # $usercontext built in DB::DB near the comment
736        # "set up the context for DB::eval ..."
737        # Evaluate and save any results.
738        @res = eval "$usercontext $evalarg;\n";  # '\n' for nice recursive debug
739
740        # Restore those old values.
741        $trace  = $otrace;
742        $single = $osingle;
743        $^D     = $od;
744    }
745
746    # Save the current value of $@, and preserve it in the debugger's copy
747    # of the saved precious globals.
748    my $at = $@;
749
750    # Since we're only saving $@, we only have to localize the array element
751    # that it will be stored in.
752    local $saved[0];    # Preserve the old value of $@
753    eval { &DB::save };
754
755    # Now see whether we need to report an error back to the user.
756    if ($at) {
757        local $\ = '';
758        print $OUT $at;
759    }
760
761    # Display as required by the caller. $onetimeDump and $onetimedumpDepth
762    # are package globals.
763    elsif ($onetimeDump) {
764        if ( $onetimeDump eq 'dump' ) {
765            local $option{dumpDepth} = $onetimedumpDepth
766              if defined $onetimedumpDepth;
767            dumpit( $OUT, \@res );
768        }
769        elsif ( $onetimeDump eq 'methods' ) {
770            methods( $res[0] );
771        }
772    } ## end elsif ($onetimeDump)
773    @res;
774} ## end sub eval
775
776############################################## End lexical danger zone
777
778# After this point it is safe to introduce lexicals.
779# The code being debugged will be executing in its own context, and
780# can't see the inside of the debugger.
781#
782# However, one should not overdo it: leave as much control from outside as
783# possible. If you make something a lexical, it's not going to be addressable
784# from outside the debugger even if you know its name.
785
786# This file is automatically included if you do perl -d.
787# It's probably not useful to include this yourself.
788#
789# Before venturing further into these twisty passages, it is
790# wise to read the perldebguts man page or risk the ire of dragons.
791#
792# (It should be noted that perldebguts will tell you a lot about
793# the underlying mechanics of how the debugger interfaces into the
794# Perl interpreter, but not a lot about the debugger itself. The new
795# comments in this code try to address this problem.)
796
797# Note that no subroutine call is possible until &DB::sub is defined
798# (for subroutines defined outside of the package DB). In fact the same is
799# true if $deep is not defined.
800
801# Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich)
802
803# modified Perl debugger, to be run from Emacs in perldb-mode
804# Ray Lischner (uunet!mntgfx!lisch) as of 5 Nov 1990
805# Johan Vromans -- upgrade to 4.0 pl 10
806# Ilya Zakharevich -- patches after 5.001 (and some before ;-)
807########################################################################
808
809=head1 DEBUGGER INITIALIZATION
810
811The debugger starts up in phases.
812
813=head2 BASIC SETUP
814
815First, it initializes the environment it wants to run in: turning off
816warnings during its own compilation, defining variables which it will need
817to avoid warnings later, setting itself up to not exit when the program
818terminates, and defaulting to printing return values for the C<r> command.
819
820=cut
821
822# Needed for the statement after exec():
823#
824# This BEGIN block is simply used to switch off warnings during debugger
825# compilation. Probably it would be better practice to fix the warnings,
826# but this is how it's done at the moment.
827
828BEGIN {
829    $ini_warn = $^W;
830    $^W       = 0;
831}    # Switch compilation warnings off until another BEGIN.
832
833local ($^W) = 0;    # Switch run-time warnings off during init.
834
835=head2 THREADS SUPPORT
836
837If we are running under a threaded Perl, we require threads and threads::shared
838if the environment variable C<PERL5DB_THREADED> is set, to enable proper
839threaded debugger control.  C<-dt> can also be used to set this.
840
841Each new thread will be announced and the debugger prompt will always inform
842you of each new thread created.  It will also indicate the thread id in which
843we are currently running within the prompt like this:
844
845    [tid] DB<$i>
846
847Where C<[tid]> is an integer thread id and C<$i> is the familiar debugger
848command prompt.  The prompt will show: C<[0]> when running under threads, but
849not actually in a thread.  C<[tid]> is consistent with C<gdb> usage.
850
851While running under threads, when you set or delete a breakpoint (etc.), this
852will apply to all threads, not just the currently running one.  When you are
853in a currently executing thread, you will stay there until it completes.  With
854the current implementation it is not currently possible to hop from one thread
855to another.
856
857The C<e> and C<E> commands are currently fairly minimal - see C<h e> and C<h E>.
858
859Note that threading support was built into the debugger as of Perl version
860C<5.8.6> and debugger version C<1.2.8>.
861
862=cut
863
864BEGIN {
865    # ensure we can share our non-threaded variables or no-op
866    if ($ENV{PERL5DB_THREADED}) {
867        require threads;
868        require threads::shared;
869        import threads::shared qw(share);
870        $DBGR;
871        share(\$DBGR);
872        lock($DBGR);
873        print "Threads support enabled\n";
874    } else {
875        *lock = sub(*) {};
876        *share = sub(\[$@%]) {};
877    }
878}
879
880# These variables control the execution of 'dumpvar.pl'.
881{
882    package dumpvar;
883    use vars qw(
884    $hashDepth
885    $arrayDepth
886    $dumpDBFiles
887    $dumpPackages
888    $quoteHighBit
889    $printUndef
890    $globPrint
891    $usageOnly
892    );
893}
894
895# used to control die() reporting in diesignal()
896{
897    package Carp;
898    use vars qw($CarpLevel);
899}
900
901# without threads, $filename is not defined until DB::DB is called
902share($main::{'_<'.$filename}) if defined $filename;
903
904# Command-line + PERLLIB:
905# Save the contents of @INC before they are modified elsewhere.
906@ini_INC = @INC;
907
908# This was an attempt to clear out the previous values of various
909# trapped errors. Apparently it didn't help. XXX More info needed!
910# $prevwarn = $prevdie = $prevbus = $prevsegv = ''; # Does not help?!
911
912# We set these variables to safe values. We don't want to blindly turn
913# off warnings, because other packages may still want them.
914$trace = $signal = $single = 0;    # Uninitialized warning suppression
915                                   # (local $^W cannot help - other packages!).
916
917# Default to not exiting when program finishes; print the return
918# value when the 'r' command is used to return from a subroutine.
919$inhibit_exit = $option{PrintRet} = 1;
920
921use vars qw($trace_to_depth);
922
923# Default to 1E9 so it won't be limited to a certain recursion depth.
924$trace_to_depth = 1E9;
925
926=head1 OPTION PROCESSING
927
928The debugger's options are actually spread out over the debugger itself and
929C<dumpvar.pl>; some of these are variables to be set, while others are
930subs to be called with a value. To try to make this a little easier to
931manage, the debugger uses a few data structures to define what options
932are legal and how they are to be processed.
933
934First, the C<@options> array defines the I<names> of all the options that
935are to be accepted.
936
937=cut
938
939@options = qw(
940  CommandSet   HistFile      HistSize
941  hashDepth    arrayDepth    dumpDepth
942  DumpDBFiles  DumpPackages  DumpReused
943  compactDump  veryCompact   quote
944  HighBit      undefPrint    globPrint
945  PrintRet     UsageOnly     frame
946  AutoTrace    TTY           noTTY
947  ReadLine     NonStop       LineInfo
948  maxTraceLen  recallCommand ShellBang
949  pager        tkRunning     ornaments
950  signalLevel  warnLevel     dieLevel
951  inhibit_exit ImmediateStop bareStringify
952  CreateTTY    RemotePort    windowSize
953  DollarCaretP
954);
955
956@RememberOnROptions = qw(DollarCaretP);
957
958=pod
959
960Second, C<optionVars> lists the variables that each option uses to save its
961state.
962
963=cut
964
965use vars qw(%optionVars);
966
967%optionVars = (
968    hashDepth     => \$dumpvar::hashDepth,
969    arrayDepth    => \$dumpvar::arrayDepth,
970    CommandSet    => \$CommandSet,
971    DumpDBFiles   => \$dumpvar::dumpDBFiles,
972    DumpPackages  => \$dumpvar::dumpPackages,
973    DumpReused    => \$dumpvar::dumpReused,
974    HighBit       => \$dumpvar::quoteHighBit,
975    undefPrint    => \$dumpvar::printUndef,
976    globPrint     => \$dumpvar::globPrint,
977    UsageOnly     => \$dumpvar::usageOnly,
978    CreateTTY     => \$CreateTTY,
979    bareStringify => \$dumpvar::bareStringify,
980    frame         => \$frame,
981    AutoTrace     => \$trace,
982    inhibit_exit  => \$inhibit_exit,
983    maxTraceLen   => \$maxtrace,
984    ImmediateStop => \$ImmediateStop,
985    RemotePort    => \$remoteport,
986    windowSize    => \$window,
987    HistFile      => \$histfile,
988    HistSize      => \$histsize,
989);
990
991=pod
992
993Third, C<%optionAction> defines the subroutine to be called to process each
994option.
995
996=cut
997
998use vars qw(%optionAction);
999
1000%optionAction = (
1001    compactDump   => \&dumpvar::compactDump,
1002    veryCompact   => \&dumpvar::veryCompact,
1003    quote         => \&dumpvar::quote,
1004    TTY           => \&TTY,
1005    noTTY         => \&noTTY,
1006    ReadLine      => \&ReadLine,
1007    NonStop       => \&NonStop,
1008    LineInfo      => \&LineInfo,
1009    recallCommand => \&recallCommand,
1010    ShellBang     => \&shellBang,
1011    pager         => \&pager,
1012    signalLevel   => \&signalLevel,
1013    warnLevel     => \&warnLevel,
1014    dieLevel      => \&dieLevel,
1015    tkRunning     => \&tkRunning,
1016    ornaments     => \&ornaments,
1017    RemotePort    => \&RemotePort,
1018    DollarCaretP  => \&DollarCaretP,
1019);
1020
1021=pod
1022
1023Last, the C<%optionRequire> notes modules that must be C<require>d if an
1024option is used.
1025
1026=cut
1027
1028# Note that this list is not complete: several options not listed here
1029# actually require that dumpvar.pl be loaded for them to work, but are
1030# not in the table. A subsequent patch will correct this problem; for
1031# the moment, we're just recommenting, and we are NOT going to change
1032# function.
1033use vars qw(%optionRequire);
1034
1035%optionRequire = (
1036    compactDump => 'dumpvar.pl',
1037    veryCompact => 'dumpvar.pl',
1038    quote       => 'dumpvar.pl',
1039);
1040
1041=pod
1042
1043There are a number of initialization-related variables which can be set
1044by putting code to set them in a BEGIN block in the C<PERL5DB> environment
1045variable. These are:
1046
1047=over 4
1048
1049=item C<$rl> - readline control XXX needs more explanation
1050
1051=item C<$warnLevel> - whether or not debugger takes over warning handling
1052
1053=item C<$dieLevel> - whether or not debugger takes over die handling
1054
1055=item C<$signalLevel> - whether or not debugger takes over signal handling
1056
1057=item C<$pre> - preprompt actions (array reference)
1058
1059=item C<$post> - postprompt actions (array reference)
1060
1061=item C<$pretype>
1062
1063=item C<$CreateTTY> - whether or not to create a new TTY for this debugger
1064
1065=item C<$CommandSet> - which command set to use (defaults to new, documented set)
1066
1067=back
1068
1069=cut
1070
1071# These guys may be defined in $ENV{PERL5DB} :
1072$rl          = 1     unless defined $rl;
1073$warnLevel   = 1     unless defined $warnLevel;
1074$dieLevel    = 1     unless defined $dieLevel;
1075$signalLevel = 1     unless defined $signalLevel;
1076$pre         = []    unless defined $pre;
1077$post        = []    unless defined $post;
1078$pretype     = []    unless defined $pretype;
1079$CreateTTY   = 3     unless defined $CreateTTY;
1080$CommandSet  = '580' unless defined $CommandSet;
1081
1082share($rl);
1083share($warnLevel);
1084share($dieLevel);
1085share($signalLevel);
1086share($pre);
1087share($post);
1088share($pretype);
1089share($rl);
1090share($CreateTTY);
1091share($CommandSet);
1092
1093=pod
1094
1095The default C<die>, C<warn>, and C<signal> handlers are set up.
1096
1097=cut
1098
1099warnLevel($warnLevel);
1100dieLevel($dieLevel);
1101signalLevel($signalLevel);
1102
1103=pod
1104
1105The pager to be used is needed next. We try to get it from the
1106environment first.  If it's not defined there, we try to find it in
1107the Perl C<Config.pm>.  If it's not there, we default to C<more>. We
1108then call the C<pager()> function to save the pager name.
1109
1110=cut
1111
1112# This routine makes sure $pager is set up so that '|' can use it.
1113pager(
1114
1115    # If PAGER is defined in the environment, use it.
1116    defined $ENV{PAGER}
1117    ? $ENV{PAGER}
1118
1119      # If not, see if Config.pm defines it.
1120    : eval { require Config }
1121      && defined $Config::Config{pager}
1122    ? $Config::Config{pager}
1123
1124      # If not, fall back to 'more'.
1125    : 'more'
1126  )
1127  unless defined $pager;
1128
1129=pod
1130
1131We set up the command to be used to access the man pages, the command
1132recall character (C<!> unless otherwise defined) and the shell escape
1133character (C<!> unless otherwise defined). Yes, these do conflict, and
1134neither works in the debugger at the moment.
1135
1136=cut
1137
1138setman();
1139
1140# Set up defaults for command recall and shell escape (note:
1141# these currently don't work in linemode debugging).
1142recallCommand("!") unless defined $prc;
1143shellBang("!")     unless defined $psh;
1144
1145=pod
1146
1147We then set up the gigantic string containing the debugger help.
1148We also set the limit on the number of arguments we'll display during a
1149trace.
1150
1151=cut
1152
1153sethelp();
1154
1155# If we didn't get a default for the length of eval/stack trace args,
1156# set it here.
1157$maxtrace = 400 unless defined $maxtrace;
1158
1159=head2 SETTING UP THE DEBUGGER GREETING
1160
1161The debugger I<greeting> helps to inform the user how many debuggers are
1162running, and whether the current debugger is the primary or a child.
1163
1164If we are the primary, we just hang onto our pid so we'll have it when
1165or if we start a child debugger. If we are a child, we'll set things up
1166so we'll have a unique greeting and so the parent will give us our own
1167TTY later.
1168
1169We save the current contents of the C<PERLDB_PIDS> environment variable
1170because we mess around with it. We'll also need to hang onto it because
1171we'll need it if we restart.
1172
1173Child debuggers make a label out of the current PID structure recorded in
1174PERLDB_PIDS plus the new PID. They also mark themselves as not having a TTY
1175yet so the parent will give them one later via C<resetterm()>.
1176
1177=cut
1178
1179# Save the current contents of the environment; we're about to
1180# much with it. We'll need this if we have to restart.
1181use vars qw($ini_pids);
1182$ini_pids = $ENV{PERLDB_PIDS};
1183
1184use vars qw ($pids $term_pid);
1185
1186if ( defined $ENV{PERLDB_PIDS} ) {
1187
1188    # We're a child. Make us a label out of the current PID structure
1189    # recorded in PERLDB_PIDS plus our (new) PID. Mark us as not having
1190    # a term yet so the parent will give us one later via resetterm().
1191
1192    my $env_pids = $ENV{PERLDB_PIDS};
1193    $pids = "[$env_pids]";
1194
1195    # Unless we are on OpenVMS, all programs under the DCL shell run under
1196    # the same PID.
1197
1198    if (($^O eq 'VMS') && ($env_pids =~ /\b$$\b/)) {
1199        $term_pid         = $$;
1200    }
1201    else {
1202        $ENV{PERLDB_PIDS} .= "->$$";
1203        $term_pid = -1;
1204    }
1205
1206} ## end if (defined $ENV{PERLDB_PIDS...
1207else {
1208
1209    # We're the parent PID. Initialize PERLDB_PID in case we end up with a
1210    # child debugger, and mark us as the parent, so we'll know to set up
1211    # more TTY's is we have to.
1212    $ENV{PERLDB_PIDS} = "$$";
1213    $pids             = "[pid=$$]";
1214    $term_pid         = $$;
1215}
1216
1217use vars qw($pidprompt);
1218$pidprompt = '';
1219
1220# Sets up $emacs as a synonym for $slave_editor.
1221our ($slave_editor);
1222*emacs = $slave_editor if $slave_editor;    # May be used in afterinit()...
1223
1224=head2 READING THE RC FILE
1225
1226The debugger will read a file of initialization options if supplied. If
1227running interactively, this is C<.perldb>; if not, it's C<perldb.ini>.
1228
1229=cut
1230
1231# As noted, this test really doesn't check accurately that the debugger
1232# is running at a terminal or not.
1233
1234use vars qw($rcfile);
1235{
1236    my $dev_tty = (($^O eq 'VMS') ? 'TT:' : '/dev/tty');
1237    # this is the wrong metric!
1238    $rcfile = ((-e $dev_tty) ? ".perldb" : "perldb.ini");
1239}
1240
1241=pod
1242
1243The debugger does a safety test of the file to be read. It must be owned
1244either by the current user or root, and must only be writable by the owner.
1245
1246=cut
1247
1248# This wraps a safety test around "do" to read and evaluate the init file.
1249#
1250# This isn't really safe, because there's a race
1251# between checking and opening.  The solution is to
1252# open and fstat the handle, but then you have to read and
1253# eval the contents.  But then the silly thing gets
1254# your lexical scope, which is unfortunate at best.
1255sub safe_do {
1256    my $file = shift;
1257
1258    # Just exactly what part of the word "CORE::" don't you understand?
1259    local $SIG{__WARN__};
1260    local $SIG{__DIE__};
1261
1262    unless ( is_safe_file($file) ) {
1263        CORE::warn <<EO_GRIPE;
1264perldb: Must not source insecure rcfile $file.
1265        You or the superuser must be the owner, and it must not
1266        be writable by anyone but its owner.
1267EO_GRIPE
1268        return;
1269    } ## end unless (is_safe_file($file...
1270
1271    do $file;
1272    CORE::warn("perldb: couldn't parse $file: $@") if $@;
1273} ## end sub safe_do
1274
1275# This is the safety test itself.
1276#
1277# Verifies that owner is either real user or superuser and that no
1278# one but owner may write to it.  This function is of limited use
1279# when called on a path instead of upon a handle, because there are
1280# no guarantees that filename (by dirent) whose file (by ino) is
1281# eventually accessed is the same as the one tested.
1282# Assumes that the file's existence is not in doubt.
1283sub is_safe_file {
1284    my $path = shift;
1285    stat($path) || return;    # mysteriously vaporized
1286    my ( $dev, $ino, $mode, $nlink, $uid, $gid ) = stat(_);
1287
1288    return 0 if $uid != 0 && $uid != $<;
1289    return 0 if $mode & 022;
1290    return 1;
1291} ## end sub is_safe_file
1292
1293# If the rcfile (whichever one we decided was the right one to read)
1294# exists, we safely do it.
1295if ( -f $rcfile ) {
1296    safe_do("./$rcfile");
1297}
1298
1299# If there isn't one here, try the user's home directory.
1300elsif ( defined $ENV{HOME} && -f "$ENV{HOME}/$rcfile" ) {
1301    safe_do("$ENV{HOME}/$rcfile");
1302}
1303
1304# Else try the login directory.
1305elsif ( defined $ENV{LOGDIR} && -f "$ENV{LOGDIR}/$rcfile" ) {
1306    safe_do("$ENV{LOGDIR}/$rcfile");
1307}
1308
1309# If the PERLDB_OPTS variable has options in it, parse those out next.
1310if ( defined $ENV{PERLDB_OPTS} ) {
1311    parse_options( $ENV{PERLDB_OPTS} );
1312}
1313
1314=pod
1315
1316The last thing we do during initialization is determine which subroutine is
1317to be used to obtain a new terminal when a new debugger is started. Right now,
1318the debugger only handles TCP sockets, X11, OS/2, amd Mac OS X
1319(darwin).
1320
1321=cut
1322
1323# Set up the get_fork_TTY subroutine to be aliased to the proper routine.
1324# Works if you're running an xterm or xterm-like window, or you're on
1325# OS/2, or on Mac OS X. This may need some expansion.
1326
1327if (not defined &get_fork_TTY)       # only if no routine exists
1328{
1329    if ( defined $remoteport ) {
1330                                                 # Expect an inetd-like server
1331        *get_fork_TTY = \&socket_get_fork_TTY;   # to listen to us
1332    }
1333    elsif (defined $ENV{TERM}                    # If we know what kind
1334                                                 # of terminal this is,
1335        and $ENV{TERM} eq 'xterm'                # and it's an xterm,
1336        and defined $ENV{DISPLAY}                # and what display it's on,
1337      )
1338    {
1339        *get_fork_TTY = \&xterm_get_fork_TTY;    # use the xterm version
1340    }
1341    elsif ( $ENV{TMUX} ) {
1342        *get_fork_TTY = \&tmux_get_fork_TTY;
1343    }
1344    elsif ( $^O eq 'os2' ) {                     # If this is OS/2,
1345        *get_fork_TTY = \&os2_get_fork_TTY;      # use the OS/2 version
1346    }
1347    elsif ( $^O eq 'darwin'                      # If this is Mac OS X
1348            and defined $ENV{TERM_PROGRAM}       # and we're running inside
1349            and $ENV{TERM_PROGRAM}
1350                eq 'Apple_Terminal'              # Terminal.app
1351            )
1352    {
1353        *get_fork_TTY = \&macosx_get_fork_TTY;   # use the Mac OS X version
1354    }
1355} ## end if (not defined &get_fork_TTY...
1356
1357# untaint $^O, which may have been tainted by the last statement.
1358# see bug [perl #24674]
1359$^O =~ m/^(.*)\z/;
1360$^O = $1;
1361
1362# Here begin the unreadable code.  It needs fixing.
1363
1364=head2 RESTART PROCESSING
1365
1366This section handles the restart command. When the C<R> command is invoked, it
1367tries to capture all of the state it can into environment variables, and
1368then sets C<PERLDB_RESTART>. When we start executing again, we check to see
1369if C<PERLDB_RESTART> is there; if so, we reload all the information that
1370the R command stuffed into the environment variables.
1371
1372  PERLDB_RESTART   - flag only, contains no restart data itself.
1373  PERLDB_HIST      - command history, if it's available
1374  PERLDB_ON_LOAD   - breakpoints set by the rc file
1375  PERLDB_POSTPONE  - subs that have been loaded/not executed,
1376                     and have actions
1377  PERLDB_VISITED   - files that had breakpoints
1378  PERLDB_FILE_...  - breakpoints for a file
1379  PERLDB_OPT       - active options
1380  PERLDB_INC       - the original @INC
1381  PERLDB_PRETYPE   - preprompt debugger actions
1382  PERLDB_PRE       - preprompt Perl code
1383  PERLDB_POST      - post-prompt Perl code
1384  PERLDB_TYPEAHEAD - typeahead captured by readline()
1385
1386We chug through all these variables and plug the values saved in them
1387back into the appropriate spots in the debugger.
1388
1389=cut
1390
1391use vars qw(%postponed_file @typeahead);
1392
1393our (@hist, @truehist);
1394
1395sub _restore_shared_globals_after_restart
1396{
1397    @hist          = get_list('PERLDB_HIST');
1398    %break_on_load = get_list("PERLDB_ON_LOAD");
1399    %postponed     = get_list("PERLDB_POSTPONE");
1400
1401    share(@hist);
1402    share(@truehist);
1403    share(%break_on_load);
1404    share(%postponed);
1405}
1406
1407sub _restore_breakpoints_and_actions {
1408
1409    my @had_breakpoints = get_list("PERLDB_VISITED");
1410
1411    for my $file_idx ( 0 .. $#had_breakpoints ) {
1412        my $filename = $had_breakpoints[$file_idx];
1413        my %pf = get_list("PERLDB_FILE_$file_idx");
1414        $postponed_file{ $filename } = \%pf if %pf;
1415        my @lines = sort {$a <=> $b} keys(%pf);
1416        my @enabled_statuses = get_list("PERLDB_FILE_ENABLED_$file_idx");
1417        for my $line_idx (0 .. $#lines) {
1418            _set_breakpoint_enabled_status(
1419                $filename,
1420                $lines[$line_idx],
1421                ($enabled_statuses[$line_idx] ? 1 : ''),
1422            );
1423        }
1424    }
1425
1426    return;
1427}
1428
1429sub _restore_options_after_restart
1430{
1431    my %options_map = get_list("PERLDB_OPT");
1432
1433    while ( my ( $opt, $val ) = each %options_map ) {
1434        $val =~ s/[\\\']/\\$1/g;
1435        parse_options("$opt'$val'");
1436    }
1437
1438    return;
1439}
1440
1441sub _restore_globals_after_restart
1442{
1443    # restore original @INC
1444    @INC     = get_list("PERLDB_INC");
1445    @ini_INC = @INC;
1446
1447    # return pre/postprompt actions and typeahead buffer
1448    $pretype   = [ get_list("PERLDB_PRETYPE") ];
1449    $pre       = [ get_list("PERLDB_PRE") ];
1450    $post      = [ get_list("PERLDB_POST") ];
1451    @typeahead = get_list( "PERLDB_TYPEAHEAD", @typeahead );
1452
1453    return;
1454}
1455
1456
1457if ( exists $ENV{PERLDB_RESTART} ) {
1458
1459    # We're restarting, so we don't need the flag that says to restart anymore.
1460    delete $ENV{PERLDB_RESTART};
1461
1462    # $restart = 1;
1463    _restore_shared_globals_after_restart();
1464
1465    _restore_breakpoints_and_actions();
1466
1467    # restore options
1468    _restore_options_after_restart();
1469
1470    _restore_globals_after_restart();
1471} ## end if (exists $ENV{PERLDB_RESTART...
1472
1473=head2 SETTING UP THE TERMINAL
1474
1475Now, we'll decide how the debugger is going to interact with the user.
1476If there's no TTY, we set the debugger to run non-stop; there's not going
1477to be anyone there to enter commands.
1478
1479=cut
1480
1481use vars qw($notty $console $tty $LINEINFO);
1482use vars qw($lineinfo $doccmd);
1483
1484our ($runnonstop);
1485
1486# Local autoflush to avoid rt#116769,
1487# as calling IO::File methods causes an unresolvable loop
1488# that results in debugger failure.
1489sub _autoflush {
1490    my $o = select($_[0]);
1491    $|++;
1492    select($o);
1493}
1494
1495if ($notty) {
1496    $runnonstop = 1;
1497    share($runnonstop);
1498}
1499
1500=pod
1501
1502If there is a TTY, we have to determine who it belongs to before we can
1503proceed. If this is a slave editor or graphical debugger (denoted by
1504the first command-line switch being '-emacs'), we shift this off and
1505set C<$rl> to 0 (XXX ostensibly to do straight reads).
1506
1507=cut
1508
1509else {
1510
1511    # Is Perl being run from a slave editor or graphical debugger?
1512    # If so, don't use readline, and set $slave_editor = 1.
1513    if ($slave_editor = ( @main::ARGV && ( $main::ARGV[0] eq '-emacs' ) )) {
1514        $rl = 0;
1515        shift(@main::ARGV);
1516    }
1517
1518    #require Term::ReadLine;
1519
1520=pod
1521
1522We then determine what the console should be on various systems:
1523
1524=over 4
1525
1526=item * Cygwin - We use C<stdin> instead of a separate device.
1527
1528=cut
1529
1530    if ( $^O eq 'cygwin' ) {
1531
1532        # /dev/tty is binary. use stdin for textmode
1533        undef $console;
1534    }
1535
1536=item * Windows or MSDOS - use C<con>.
1537
1538=cut
1539
1540    elsif ( $^O eq 'dos' or -e "con" or $^O eq 'MSWin32' ) {
1541        $console = "con";
1542    }
1543
1544=item * AmigaOS - use C<CONSOLE:>.
1545
1546=cut
1547
1548    elsif ( $^O eq 'amigaos' ) {
1549        $console = "CONSOLE:";
1550    }
1551
1552=item * VMS - use C<sys$command>.
1553
1554=cut
1555
1556    elsif ($^O eq 'VMS') {
1557        $console = 'sys$command';
1558    }
1559
1560# Keep this penultimate, on the grounds that it satisfies a wide variety of
1561# Unix-like systems that would otherwise need to be identified individually.
1562
1563=item * Unix - use F</dev/tty>.
1564
1565=cut
1566
1567    elsif ( -e "/dev/tty" ) {
1568        $console = "/dev/tty";
1569    }
1570
1571# Keep this last.
1572
1573    else {
1574        _db_warn("Can't figure out your console, using stdin");
1575        undef $console;
1576    }
1577
1578=pod
1579
1580=back
1581
1582Several other systems don't use a specific console. We C<undef $console>
1583for those (Windows using a slave editor/graphical debugger, NetWare, OS/2
1584with a slave editor).
1585
1586=cut
1587
1588    if ( ( $^O eq 'MSWin32' ) and ( $slave_editor or defined $ENV{EMACS} ) ) {
1589
1590        # /dev/tty is binary. use stdin for textmode
1591        $console = undef;
1592    }
1593
1594    if ( $^O eq 'NetWare' ) {
1595
1596        # /dev/tty is binary. use stdin for textmode
1597        $console = undef;
1598    }
1599
1600    # In OS/2, we need to use STDIN to get textmode too, even though
1601    # it pretty much looks like Unix otherwise.
1602    if ( defined $ENV{OS2_SHELL} and ( $slave_editor or $ENV{WINDOWID} ) )
1603    {    # In OS/2
1604        $console = undef;
1605    }
1606
1607=pod
1608
1609If there is a TTY hanging around from a parent, we use that as the console.
1610
1611=cut
1612
1613    $console = $tty if defined $tty;
1614
1615=head2 SOCKET HANDLING
1616
1617The debugger is capable of opening a socket and carrying out a debugging
1618session over the socket.
1619
1620If C<RemotePort> was defined in the options, the debugger assumes that it
1621should try to start a debugging session on that port. It builds the socket
1622and then tries to connect the input and output filehandles to it.
1623
1624=cut
1625
1626    # Handle socket stuff.
1627
1628    if ( defined $remoteport ) {
1629
1630        # If RemotePort was defined in the options, connect input and output
1631        # to the socket.
1632        $IN = $OUT = connect_remoteport();
1633    } ## end if (defined $remoteport)
1634
1635=pod
1636
1637If no C<RemotePort> was defined, and we want to create a TTY on startup,
1638this is probably a situation where multiple debuggers are running (for example,
1639a backticked command that starts up another debugger). We create a new IN and
1640OUT filehandle, and do the necessary mojo to create a new TTY if we know how
1641and if we can.
1642
1643=cut
1644
1645    # Non-socket.
1646    else {
1647
1648        # Two debuggers running (probably a system or a backtick that invokes
1649        # the debugger itself under the running one). create a new IN and OUT
1650        # filehandle, and do the necessary mojo to create a new tty if we
1651        # know how, and we can.
1652        create_IN_OUT(4) if $CreateTTY & 4;
1653        if ($console) {
1654
1655            # If we have a console, check to see if there are separate ins and
1656            # outs to open. (They are assumed identical if not.)
1657
1658            my ( $i, $o ) = split /,/, $console;
1659            $o = $i unless defined $o;
1660
1661            # read/write on in, or just read, or read on STDIN.
1662                 open( IN, '+<', $i )
1663              || open( IN, '<',  $i )
1664              || open( IN, "<&STDIN" );
1665
1666            # read/write/create/clobber out, or write/create/clobber out,
1667            # or merge with STDERR, or merge with STDOUT.
1668                 open( OUT, '+>', $o )
1669              || open( OUT, '>',  $o )
1670              || open( OUT, ">&STDERR" )
1671              || open( OUT, ">&STDOUT" );    # so we don't dongle stdout
1672
1673        } ## end if ($console)
1674        elsif ( not defined $console ) {
1675
1676            # No console. Open STDIN.
1677            open( IN, "<&STDIN" );
1678
1679            # merge with STDERR, or with STDOUT.
1680            open( OUT,      ">&STDERR" )
1681              || open( OUT, ">&STDOUT" );    # so we don't dongle stdout
1682            $console = 'STDIN/OUT';
1683        } ## end elsif (not defined $console)
1684
1685        # Keep copies of the filehandles so that when the pager runs, it
1686        # can close standard input without clobbering ours.
1687        if ($console or (not defined($console))) {
1688            $IN = \*IN;
1689            $OUT = \*OUT;
1690        }
1691    } ## end elsif (from if(defined $remoteport))
1692
1693    # Unbuffer DB::OUT. We need to see responses right away.
1694    _autoflush($OUT);
1695
1696    # Line info goes to debugger output unless pointed elsewhere.
1697    # Pointing elsewhere makes it possible for slave editors to
1698    # keep track of file and position. We have both a filehandle
1699    # and a I/O description to keep track of.
1700    $LINEINFO = $OUT     unless defined $LINEINFO;
1701    $lineinfo = $console unless defined $lineinfo;
1702    # share($LINEINFO); # <- unable to share globs
1703    share($lineinfo);   #
1704
1705=pod
1706
1707To finish initialization, we show the debugger greeting,
1708and then call the C<afterinit()> subroutine if there is one.
1709
1710=cut
1711
1712    # Show the debugger greeting.
1713    $header =~ s/.Header: ([^,]+),v(\s+\S+\s+\S+).*$/$1$2/;
1714    unless ($runnonstop) {
1715        local $\ = '';
1716        local $, = '';
1717        if ( $term_pid eq '-1' ) {
1718            print $OUT "\nDaughter DB session started...\n";
1719        }
1720        else {
1721            print $OUT "\nLoading DB routines from $header\n";
1722            print $OUT (
1723                "Editor support ",
1724                $slave_editor ? "enabled" : "available", ".\n"
1725            );
1726            print $OUT
1727"\nEnter h or 'h h' for help, or '$doccmd perldebug' for more help.\n\n";
1728        } ## end else [ if ($term_pid eq '-1')
1729    } ## end unless ($runnonstop)
1730} ## end else [ if ($notty)
1731
1732# XXX This looks like a bug to me.
1733# Why copy to @ARGS and then futz with @args?
1734@ARGS = @ARGV;
1735# for (@args) {
1736    # Make sure backslashes before single quotes are stripped out, and
1737    # keep args unless they are numeric (XXX why?)
1738    # s/\'/\\\'/g;                      # removed while not justified understandably
1739    # s/(.*)/'$1'/ unless /^-?[\d.]+$/; # ditto
1740# }
1741
1742# If there was an afterinit() sub defined, call it. It will get
1743# executed in our scope, so it can fiddle with debugger globals.
1744if ( defined &afterinit ) {    # May be defined in $rcfile
1745    afterinit();
1746}
1747
1748# Inform us about "Stack dump during die enabled ..." in dieLevel().
1749use vars qw($I_m_init);
1750
1751$I_m_init = 1;
1752
1753############################################################ Subroutines
1754
1755=head1 SUBROUTINES
1756
1757=head2 DB
1758
1759This gigantic subroutine is the heart of the debugger. Called before every
1760statement, its job is to determine if a breakpoint has been reached, and
1761stop if so; read commands from the user, parse them, and execute
1762them, and then send execution off to the next statement.
1763
1764Note that the order in which the commands are processed is very important;
1765some commands earlier in the loop will actually alter the C<$cmd> variable
1766to create other commands to be executed later. This is all highly I<optimized>
1767but can be confusing. Check the comments for each C<$cmd ... && do {}> to
1768see what's happening in any given command.
1769
1770=cut
1771
1772# $cmd cannot be an our() variable unfortunately (possible perl bug?).
1773
1774use vars qw(
1775    $action
1776    $cmd
1777    $file
1778    $filename_ini
1779    $finished
1780    %had_breakpoints
1781    $level
1782    $max
1783    $package
1784    $try
1785);
1786
1787our (
1788    %alias,
1789    $doret,
1790    $end,
1791    $fall_off_end,
1792    $incr,
1793    $laststep,
1794    $rc,
1795    $sh,
1796    $stack_depth,
1797    @stack,
1798    @to_watch,
1799    @old_watch,
1800);
1801
1802sub _DB__use_full_path
1803{
1804	local @INC = @INC;
1805	eval { require Config; };
1806	unshift(@INC,
1807	    @Config::Config{qw(archlibexp privlibexp sitearchexp sitelibexp)});
1808	&{$_[0]};
1809}
1810
1811sub _DB__determine_if_we_should_break
1812{
1813    # if we have something here, see if we should break.
1814    # $stop is lexical and local to this block - $action on the other hand
1815    # is global.
1816    my $stop;
1817
1818    if ( $dbline{$line}
1819        && _is_breakpoint_enabled($filename, $line)
1820        && (( $stop, $action ) = split( /\0/, $dbline{$line} ) ) )
1821    {
1822
1823        # Stop if the stop criterion says to just stop.
1824        if ( $stop eq '1' ) {
1825            $signal |= 1;
1826        }
1827
1828        # It's a conditional stop; eval it in the user's context and
1829        # see if we should stop. If so, remove the one-time sigil.
1830        elsif ($stop) {
1831            $evalarg = "\$DB::signal |= 1 if do {$stop}";
1832            # The &-call is here to ascertain the mutability of @_.
1833            &DB::eval;
1834            # If the breakpoint is temporary, then delete its enabled status.
1835            if ($dbline{$line} =~ s/;9($|\0)/$1/) {
1836                _cancel_breakpoint_temp_enabled_status($filename, $line);
1837            }
1838        }
1839    } ## end if ($dbline{$line} && ...
1840}
1841
1842sub _DB__is_finished {
1843    if ($finished and $level <= 1) {
1844        end_report();
1845        return 1;
1846    }
1847    else {
1848        return;
1849    }
1850}
1851
1852sub _DB__read_next_cmd
1853{
1854    my ($tid) = @_;
1855
1856    # We have a terminal, or can get one ...
1857    if (!$term) {
1858        setterm();
1859    }
1860
1861    # ... and it belongs to this PID or we get one for this PID ...
1862    if ($term_pid != $$) {
1863        resetterm(1);
1864    }
1865
1866    # ... and we got a line of command input ...
1867    $cmd = DB::readline(
1868        "$pidprompt $tid DB"
1869        . ( '<' x $level )
1870        . ( $#hist + 1 )
1871        . ( '>' x $level ) . " "
1872    );
1873
1874    return defined($cmd);
1875}
1876
1877sub _DB__trim_command_and_return_first_component {
1878    my ($obj) = @_;
1879
1880    $cmd =~ s/\A\s+//s;    # trim annoying leading whitespace
1881    $cmd =~ s/\s+\z//s;    # trim annoying trailing whitespace
1882
1883    # A single-character debugger command can be immediately followed by its
1884    # argument if they aren't both alphanumeric; otherwise require space
1885    # between commands and arguments:
1886    my ($verb, $args) = $cmd =~ m{\A(.\b|\S*)\s*(.*)}s;
1887
1888    $obj->cmd_verb($verb);
1889    $obj->cmd_args($args);
1890
1891    return;
1892}
1893
1894sub _DB__handle_f_command {
1895    my ($obj) = @_;
1896
1897    if ($file = $obj->cmd_args) {
1898        # help for no arguments (old-style was return from sub).
1899        if ( !$file ) {
1900            print $OUT
1901            "The old f command is now the r command.\n";    # hint
1902            print $OUT "The new f command switches filenames.\n";
1903            next CMD;
1904        } ## end if (!$file)
1905
1906        # if not in magic file list, try a close match.
1907        if ( !defined $main::{ '_<' . $file } ) {
1908            if ( ($try) = grep( m#^_<.*$file#, keys %main:: ) ) {
1909                {
1910                    $try = substr( $try, 2 );
1911                    print $OUT "Choosing $try matching '$file':\n";
1912                    $file = $try;
1913                }
1914            } ## end if (($try) = grep(m#^_<.*$file#...
1915        } ## end if (!defined $main::{ ...
1916
1917        # If not successfully switched now, we failed.
1918        if ( !defined $main::{ '_<' . $file } ) {
1919            print $OUT "No file matching '$file' is loaded.\n";
1920            next CMD;
1921        }
1922
1923        # We switched, so switch the debugger internals around.
1924        elsif ( $file ne $filename ) {
1925            *dbline   = $main::{ '_<' . $file };
1926            $max      = $#dbline;
1927            $filename = $file;
1928            $start    = 1;
1929            $cmd      = "l";
1930        } ## end elsif ($file ne $filename)
1931
1932        # We didn't switch; say we didn't.
1933        else {
1934            print $OUT "Already in $file.\n";
1935            next CMD;
1936        }
1937    }
1938
1939    return;
1940}
1941
1942sub _DB__handle_dot_command {
1943    my ($obj) = @_;
1944
1945    # . command.
1946    if ($obj->_is_full('.')) {
1947        $incr = -1;    # stay at current line
1948
1949        # Reset everything to the old location.
1950        $start    = $line;
1951        $filename = $filename_ini;
1952        *dbline   = $main::{ '_<' . $filename };
1953        $max      = $#dbline;
1954
1955        # Now where are we?
1956        print_lineinfo($obj->position());
1957        next CMD;
1958    }
1959
1960    return;
1961}
1962
1963sub _DB__handle_y_command {
1964    my ($obj) = @_;
1965
1966    if (my ($match_level, $match_vars)
1967        = $obj->cmd_args =~ /\A(?:(\d*)\s*(.*))?\z/) {
1968
1969        # See if we've got the necessary support.
1970        if (!eval {
1971            local @INC = @INC;
1972            pop @INC if $INC[-1] eq '.';
1973	    _DB__use_full_path(sub {
1974	    	require PadWalker;
1975	    });
1976	    PadWalker->VERSION(0.08) }) {
1977            my $Err = $@;
1978            _db_warn(
1979                $Err =~ /locate/
1980                ? "PadWalker module not found - please install\n"
1981                : $Err
1982            );
1983            next CMD;
1984        }
1985
1986        # Load up dumpvar if we don't have it. If we can, that is.
1987        do 'dumpvar.pl' || die $@ unless defined &main::dumpvar;
1988        defined &main::dumpvar
1989            or print $OUT "dumpvar.pl not available.\n"
1990            and next CMD;
1991
1992        # Got all the modules we need. Find them and print them.
1993        my @vars = split( ' ', $match_vars || '' );
1994
1995        # Find the pad.
1996        my $h = eval { PadWalker::peek_my( ( $match_level || 0 ) + 2 ) };
1997
1998        # Oops. Can't find it.
1999        if (my $Err = $@) {
2000            $Err =~ s/ at .*//;
2001            _db_warn($Err);
2002            next CMD;
2003        }
2004
2005        # Show the desired vars with dumplex().
2006        my $savout = select($OUT);
2007
2008        # Have dumplex dump the lexicals.
2009        foreach my $key (sort keys %$h) {
2010            dumpvar::dumplex( $key, $h->{$key},
2011                defined $option{dumpDepth} ? $option{dumpDepth} : -1,
2012                @vars );
2013        }
2014        select($savout);
2015        next CMD;
2016    }
2017}
2018
2019sub _DB__handle_c_command {
2020    my ($obj) = @_;
2021
2022    my $i = $obj->cmd_args;
2023
2024    if ($i =~ m#\A[\w:]*\z#) {
2025
2026        # Hey, show's over. The debugged program finished
2027        # executing already.
2028        next CMD if _DB__is_finished();
2029
2030        # Capture the place to put a one-time break.
2031        $subname = $i;
2032
2033        #  Probably not needed, since we finish an interactive
2034        #  sub-session anyway...
2035        # local $filename = $filename;
2036        # local *dbline = *dbline; # XXX Would this work?!
2037        #
2038        # The above question wonders if localizing the alias
2039        # to the magic array works or not. Since it's commented
2040        # out, we'll just leave that to speculation for now.
2041
2042        # If the "subname" isn't all digits, we'll assume it
2043        # is a subroutine name, and try to find it.
2044        if ( $subname =~ /\D/ ) {    # subroutine name
2045            # Qualify it to the current package unless it's
2046            # already qualified.
2047            $subname = $package . "::" . $subname
2048            unless $subname =~ /::/;
2049
2050            # find_sub will return "file:line_number" corresponding
2051            # to where the subroutine is defined; we call find_sub,
2052            # break up the return value, and assign it in one
2053            # operation.
2054            ( $file, $i ) = ( find_sub($subname) =~ /^(.*):(.*)$/ );
2055
2056            # Force the line number to be numeric.
2057            $i = $i + 0;
2058
2059            # If we got a line number, we found the sub.
2060            if ($i) {
2061
2062                # Switch all the debugger's internals around so
2063                # we're actually working with that file.
2064                $filename = $file;
2065                *dbline   = $main::{ '_<' . $filename };
2066
2067                # Mark that there's a breakpoint in this file.
2068                $had_breakpoints{$filename} |= 1;
2069
2070                # Scan forward to the first executable line
2071                # after the 'sub whatever' line.
2072                $max = $#dbline;
2073                my $_line_num = $i;
2074                while ($dbline[$_line_num] == 0 && $_line_num< $max)
2075                {
2076                    $_line_num++;
2077                }
2078                $i = $_line_num;
2079            } ## end if ($i)
2080
2081            # We didn't find a sub by that name.
2082            else {
2083                print $OUT "Subroutine $subname not found.\n";
2084                next CMD;
2085            }
2086        } ## end if ($subname =~ /\D/)
2087
2088        # At this point, either the subname was all digits (an
2089        # absolute line-break request) or we've scanned through
2090        # the code following the definition of the sub, looking
2091        # for an executable, which we may or may not have found.
2092        #
2093        # If $i (which we set $subname from) is non-zero, we
2094        # got a request to break at some line somewhere. On
2095        # one hand, if there wasn't any real subroutine name
2096        # involved, this will be a request to break in the current
2097        # file at the specified line, so we have to check to make
2098        # sure that the line specified really is breakable.
2099        #
2100        # On the other hand, if there was a subname supplied, the
2101        # preceding block has moved us to the proper file and
2102        # location within that file, and then scanned forward
2103        # looking for the next executable line. We have to make
2104        # sure that one was found.
2105        #
2106        # On the gripping hand, we can't do anything unless the
2107        # current value of $i points to a valid breakable line.
2108        # Check that.
2109        if ($i) {
2110
2111            # Breakable?
2112            if ( $dbline[$i] == 0 ) {
2113                print $OUT "Line $i not breakable.\n";
2114                next CMD;
2115            }
2116
2117            # Yes. Set up the one-time-break sigil.
2118            $dbline{$i} =~ s/($|\0)/;9$1/;  # add one-time-only b.p.
2119            _enable_breakpoint_temp_enabled_status($filename, $i);
2120        } ## end if ($i)
2121
2122        # Turn off stack tracing from here up.
2123        for my $j (0 .. $stack_depth) {
2124            $stack[ $j ] &= ~1;
2125        }
2126        last CMD;
2127    }
2128
2129    return;
2130}
2131
2132sub _DB__handle_forward_slash_command {
2133    my ($obj) = @_;
2134
2135    # The pattern as a string.
2136    use vars qw($inpat);
2137
2138    if (($inpat) = $cmd =~ m#\A/(.*)\z#) {
2139
2140        # Remove the final slash.
2141        $inpat =~ s:([^\\])/$:$1:;
2142
2143        # If the pattern isn't null ...
2144        if ( $inpat ne "" ) {
2145
2146            # Turn off warn and die processing for a bit.
2147            local $SIG{__DIE__};
2148            local $SIG{__WARN__};
2149
2150            # Create the pattern.
2151            eval 'no strict q/vars/; $inpat =~ m' . "\a$inpat\a";
2152            if ( $@ ne "" ) {
2153
2154                # Oops. Bad pattern. No biscuit.
2155                # Print the eval error and go back for more
2156                # commands.
2157                print {$OUT} "$@";
2158                next CMD;
2159            }
2160            $obj->pat($inpat);
2161        } ## end if ($inpat ne "")
2162
2163        # Set up to stop on wrap-around.
2164        $end = $start;
2165
2166        # Don't move off the current line.
2167        $incr = -1;
2168
2169        my $pat = $obj->pat;
2170
2171        # Done in eval so nothing breaks if the pattern
2172        # does something weird.
2173        eval
2174        {
2175            no strict q/vars/;
2176            for (;;) {
2177                # Move ahead one line.
2178                ++$start;
2179
2180                # Wrap if we pass the last line.
2181                if ($start > $max) {
2182                    $start = 1;
2183                }
2184
2185                # Stop if we have gotten back to this line again,
2186                last if ($start == $end);
2187
2188                # A hit! (Note, though, that we are doing
2189                # case-insensitive matching. Maybe a qr//
2190                # expression would be better, so the user could
2191                # do case-sensitive matching if desired.
2192                if ($dbline[$start] =~ m/$pat/i) {
2193                    if ($slave_editor) {
2194                        # Handle proper escaping in the slave.
2195                        print {$OUT} "\032\032$filename:$start:0\n";
2196                    }
2197                    else {
2198                        # Just print the line normally.
2199                        print {$OUT} "$start:\t",$dbline[$start],"\n";
2200                    }
2201                    # And quit since we found something.
2202                    last;
2203                }
2204            }
2205        };
2206
2207        if ($@) {
2208            warn $@;
2209        }
2210
2211        # If we wrapped, there never was a match.
2212        if ( $start == $end ) {
2213            print {$OUT} "/$pat/: not found\n";
2214        }
2215        next CMD;
2216    }
2217
2218    return;
2219}
2220
2221sub _DB__handle_question_mark_command {
2222    my ($obj) = @_;
2223
2224    # ? - backward pattern search.
2225    if (my ($inpat) = $cmd =~ m#\A\?(.*)\z#) {
2226
2227        # Get the pattern, remove trailing question mark.
2228        $inpat =~ s:([^\\])\?$:$1:;
2229
2230        # If we've got one ...
2231        if ( $inpat ne "" ) {
2232
2233            # Turn off die & warn handlers.
2234            local $SIG{__DIE__};
2235            local $SIG{__WARN__};
2236            eval '$inpat =~ m' . "\a$inpat\a";
2237
2238            if ( $@ ne "" ) {
2239
2240                # Ouch. Not good. Print the error.
2241                print $OUT $@;
2242                next CMD;
2243            }
2244            $obj->pat($inpat);
2245        } ## end if ($inpat ne "")
2246
2247        # Where we are now is where to stop after wraparound.
2248        $end = $start;
2249
2250        # Don't move away from this line.
2251        $incr = -1;
2252
2253        my $pat = $obj->pat;
2254        # Search inside the eval to prevent pattern badness
2255        # from killing us.
2256        eval {
2257            no strict q/vars/;
2258            for (;;) {
2259                # Back up a line.
2260                --$start;
2261
2262                # Wrap if we pass the first line.
2263
2264                $start = $max if ($start <= 0);
2265
2266                # Quit if we get back where we started,
2267                last if ($start == $end);
2268
2269                # Match?
2270                if ($dbline[$start] =~ m/$pat/i) {
2271                    if ($slave_editor) {
2272                        # Yep, follow slave editor requirements.
2273                        print $OUT "\032\032$filename:$start:0\n";
2274                    }
2275                    else {
2276                        # Yep, just print normally.
2277                        print $OUT "$start:\t",$dbline[$start],"\n";
2278                    }
2279
2280                    # Found, so done.
2281                    last;
2282                }
2283            }
2284        };
2285
2286        # Say we failed if the loop never found anything,
2287        if ( $start == $end ) {
2288            print {$OUT} "?$pat?: not found\n";
2289        }
2290        next CMD;
2291    }
2292
2293    return;
2294}
2295
2296sub _DB__handle_restart_and_rerun_commands {
2297    my ($obj) = @_;
2298
2299    my $cmd_cmd = $obj->cmd_verb;
2300    my $cmd_params = $obj->cmd_args;
2301    # R - restart execution.
2302    # rerun - controlled restart execution.
2303    if ($cmd_cmd eq 'rerun' or $cmd_params eq '') {
2304
2305        # Change directory to the initial current working directory on
2306        # the script startup, so if the debugged program changed the
2307        # directory, then we will still be able to find the path to the
2308        # program. (perl 5 RT #121509 ).
2309        chdir ($_initial_cwd);
2310
2311        my @args = ($cmd_cmd eq 'R' ? restart() : rerun($cmd_params));
2312
2313        # Close all non-system fds for a clean restart.  A more
2314        # correct method would be to close all fds that were not
2315        # open when the process started, but this seems to be
2316        # hard.  See "debugger 'R'estart and open database
2317        # connections" on p5p.
2318
2319        my $max_fd = 1024; # default if POSIX can't be loaded
2320        if (eval { require POSIX }) {
2321            eval { $max_fd = POSIX::sysconf(POSIX::_SC_OPEN_MAX()) };
2322        }
2323
2324        if (defined $max_fd) {
2325            foreach ($^F+1 .. $max_fd-1) {
2326                next unless open FD_TO_CLOSE, "<&=$_";
2327                close(FD_TO_CLOSE);
2328            }
2329        }
2330
2331        # And run Perl again.  We use exec() to keep the
2332        # PID stable (and that way $ini_pids is still valid).
2333        exec(@args) or print {$OUT} "exec failed: $!\n";
2334
2335        last CMD;
2336    }
2337
2338    return;
2339}
2340
2341sub _DB__handle_run_command_in_pager_command {
2342    my ($obj) = @_;
2343
2344    if ($cmd =~ m#\A\|\|?\s*[^|]#) {
2345        if ( $pager =~ /^\|/ ) {
2346
2347            # Default pager is into a pipe. Redirect I/O.
2348            open( SAVEOUT, ">&STDOUT" )
2349            || _db_warn("Can't save STDOUT");
2350            open( STDOUT, ">&OUT" )
2351            || _db_warn("Can't redirect STDOUT");
2352        } ## end if ($pager =~ /^\|/)
2353        else {
2354
2355            # Not into a pipe. STDOUT is safe.
2356            open( SAVEOUT, ">&OUT" ) || _db_warn("Can't save DB::OUT");
2357        }
2358
2359        # Fix up environment to record we have less if so.
2360        fix_less();
2361
2362        unless ( $obj->piped(scalar ( open( OUT, $pager ) ) ) ) {
2363
2364            # Couldn't open pipe to pager.
2365            _db_warn("Can't pipe output to '$pager'");
2366            if ( $pager =~ /^\|/ ) {
2367
2368                # Redirect I/O back again.
2369                open( OUT, ">&STDOUT" )    # XXX: lost message
2370                || _db_warn("Can't restore DB::OUT");
2371                open( STDOUT, ">&SAVEOUT" )
2372                || _db_warn("Can't restore STDOUT");
2373                close(SAVEOUT);
2374            } ## end if ($pager =~ /^\|/)
2375            else {
2376
2377                # Redirect I/O. STDOUT already safe.
2378                open( OUT, ">&STDOUT" )    # XXX: lost message
2379                || _db_warn("Can't restore DB::OUT");
2380            }
2381            next CMD;
2382        } ## end unless ($piped = open(OUT,...
2383
2384        # Set up broken-pipe handler if necessary.
2385        $SIG{PIPE} = \&DB::catch
2386        if $pager =~ /^\|/
2387        && ( "" eq $SIG{PIPE} || "DEFAULT" eq $SIG{PIPE} );
2388
2389        _autoflush(\*OUT);
2390        # Save current filehandle, and put it back.
2391        $obj->selected(scalar( select(OUT) ));
2392        # Don't put it back if pager was a pipe.
2393        if ($cmd !~ /\A\|\|/)
2394        {
2395            select($obj->selected());
2396            $obj->selected("");
2397        }
2398
2399        # Trim off the pipe symbols and run the command now.
2400        $cmd =~ s#\A\|+\s*##;
2401        redo PIPE;
2402    }
2403
2404    return;
2405}
2406
2407sub _DB__handle_m_command {
2408    my ($obj) = @_;
2409
2410    if ($cmd =~ s#\Am\s+([\w:]+)\s*\z# #) {
2411        methods($1);
2412        next CMD;
2413    }
2414
2415    # m expr - set up DB::eval to do the work
2416    if ($cmd =~ s#\Am\b# #) {    # Rest gets done by DB::eval()
2417        $onetimeDump = 'methods';   #  method output gets used there
2418    }
2419
2420    return;
2421}
2422
2423sub _DB__at_end_of_every_command {
2424    my ($obj) = @_;
2425
2426    # At the end of every command:
2427    if ($obj->piped) {
2428
2429        # Unhook the pipe mechanism now.
2430        if ( $pager =~ /^\|/ ) {
2431
2432            # No error from the child.
2433            $? = 0;
2434
2435            # we cannot warn here: the handle is missing --tchrist
2436            close(OUT) || print SAVEOUT "\nCan't close DB::OUT\n";
2437
2438            # most of the $? crud was coping with broken cshisms
2439            # $? is explicitly set to 0, so this never runs.
2440            if ($?) {
2441                print SAVEOUT "Pager '$pager' failed: ";
2442                if ( $? == -1 ) {
2443                    print SAVEOUT "shell returned -1\n";
2444                }
2445                elsif ( $? >> 8 ) {
2446                    print SAVEOUT ( $? & 127 )
2447                    ? " (SIG#" . ( $? & 127 ) . ")"
2448                    : "", ( $? & 128 ) ? " -- core dumped" : "", "\n";
2449                }
2450                else {
2451                    print SAVEOUT "status ", ( $? >> 8 ), "\n";
2452                }
2453            } ## end if ($?)
2454
2455            # Reopen filehandle for our output (if we can) and
2456            # restore STDOUT (if we can).
2457            open( OUT, ">&STDOUT" ) || _db_warn("Can't restore DB::OUT");
2458            open( STDOUT, ">&SAVEOUT" )
2459            || _db_warn("Can't restore STDOUT");
2460
2461            # Turn off pipe exception handler if necessary.
2462            $SIG{PIPE} = "DEFAULT" if $SIG{PIPE} eq \&DB::catch;
2463
2464            # Will stop ignoring SIGPIPE if done like nohup(1)
2465            # does SIGINT but Perl doesn't give us a choice.
2466        } ## end if ($pager =~ /^\|/)
2467        else {
2468
2469            # Non-piped "pager". Just restore STDOUT.
2470            open( OUT, ">&SAVEOUT" ) || _db_warn("Can't restore DB::OUT");
2471        }
2472
2473        # Let Readline know about the new filehandles.
2474        reset_IN_OUT( \*IN, \*OUT );
2475
2476        # Close filehandle pager was using, restore the normal one
2477        # if necessary,
2478        close(SAVEOUT);
2479
2480        if ($obj->selected() ne "") {
2481            select($obj->selected);
2482            $obj->selected("");
2483        }
2484
2485        # No pipes now.
2486        $obj->piped("");
2487    } ## end if ($piped)
2488
2489    return;
2490}
2491
2492sub _DB__handle_watch_expressions
2493{
2494    my $self = shift;
2495
2496    if ( $DB::trace & 2 ) {
2497        for my $n (0 .. $#DB::to_watch) {
2498            $DB::evalarg = $DB::to_watch[$n];
2499            local $DB::onetimeDump;    # Tell DB::eval() to not output results
2500
2501            # Fix context DB::eval() wants to return an array, but
2502            # we need a scalar here.
2503            my ($val) = join( "', '", DB::eval(@_) );
2504            $val = ( ( defined $val ) ? "'$val'" : 'undef' );
2505
2506            # Did it change?
2507            if ( $val ne $DB::old_watch[$n] ) {
2508
2509                # Yep! Show the difference, and fake an interrupt.
2510                $DB::signal = 1;
2511                print {$DB::OUT} <<EOP;
2512Watchpoint $n:\t$DB::to_watch[$n] changed:
2513    old value:\t$DB::old_watch[$n]
2514    new value:\t$val
2515EOP
2516                $DB::old_watch[$n] = $val;
2517            } ## end if ($val ne $old_watch...
2518        } ## end for my $n (0 ..
2519    } ## end if ($trace & 2)
2520
2521    return;
2522}
2523
2524# 't' is type.
2525# 'm' is method.
2526# 'v' is the value (i.e: method name or subroutine ref).
2527# 's' is subroutine.
2528my %cmd_lookup;
2529
2530BEGIN
2531{
2532    %cmd_lookup =
2533(
2534    '-' => { t => 'm', v => '_handle_dash_command', },
2535    '.' => { t => 's', v => \&_DB__handle_dot_command, },
2536    '=' => { t => 'm', v => '_handle_equal_sign_command', },
2537    'H' => { t => 'm', v => '_handle_H_command', },
2538    'S' => { t => 'm', v => '_handle_S_command', },
2539    'T' => { t => 'm', v => '_handle_T_command', },
2540    'W' => { t => 'm', v => '_handle_W_command', },
2541    'c' => { t => 's', v => \&_DB__handle_c_command, },
2542    'f' => { t => 's', v => \&_DB__handle_f_command, },
2543    'm' => { t => 's', v => \&_DB__handle_m_command, },
2544    'n' => { t => 'm', v => '_handle_n_command', },
2545    'p' => { t => 'm', v => '_handle_p_command', },
2546    'q' => { t => 'm', v => '_handle_q_command', },
2547    'r' => { t => 'm', v => '_handle_r_command', },
2548    's' => { t => 'm', v => '_handle_s_command', },
2549    'save' => { t => 'm', v => '_handle_save_command', },
2550    'source' => { t => 'm', v => '_handle_source_command', },
2551    't' => { t => 'm', v => '_handle_t_command', },
2552    'w' => { t => 'm', v => '_handle_w_command', },
2553    'x' => { t => 'm', v => '_handle_x_command', },
2554    'y' => { t => 's', v => \&_DB__handle_y_command, },
2555    (map { $_ => { t => 'm', v => '_handle_V_command_and_X_command', }, }
2556        ('X', 'V')),
2557    (map { $_ => { t => 'm', v => '_handle_enable_disable_commands', }, }
2558        qw(enable disable)),
2559    (map { $_ =>
2560        { t => 's', v => \&_DB__handle_restart_and_rerun_commands, },
2561        } qw(R rerun)),
2562    (map { $_ => {t => 'm', v => '_handle_cmd_wrapper_commands' }, }
2563        qw(a A b B e E h i l L M o O v w W)),
2564);
2565};
2566
2567sub DB {
2568
2569    # lock the debugger and get the thread id for the prompt
2570    lock($DBGR);
2571    my $tid;
2572    my $position;
2573    my ($prefix, $after, $infix);
2574    my $pat;
2575    my $explicit_stop;
2576    my $piped;
2577    my $selected;
2578
2579    if ($ENV{PERL5DB_THREADED}) {
2580        $tid = eval { "[".threads->tid."]" };
2581    }
2582
2583    my $cmd_verb;
2584    my $cmd_args;
2585
2586    my $obj = DB::Obj->new(
2587        {
2588            position => \$position,
2589            prefix => \$prefix,
2590            after => \$after,
2591            explicit_stop => \$explicit_stop,
2592            infix => \$infix,
2593            cmd_args => \$cmd_args,
2594            cmd_verb => \$cmd_verb,
2595            pat => \$pat,
2596            piped => \$piped,
2597            selected => \$selected,
2598        },
2599    );
2600
2601    $obj->_DB_on_init__initialize_globals(@_);
2602
2603    # Preserve current values of $@, $!, $^E, $,, $/, $\, $^W.
2604    # The code being debugged may have altered them.
2605    DB::save();
2606
2607    # Since DB::DB gets called after every line, we can use caller() to
2608    # figure out where we last were executing. Sneaky, eh? This works because
2609    # caller is returning all the extra information when called from the
2610    # debugger.
2611    local ( $package, $filename, $line ) = caller;
2612    $filename_ini = $filename;
2613
2614    # set up the context for DB::eval, so it can properly execute
2615    # code on behalf of the user. We add the package in so that the
2616    # code is eval'ed in the proper package (not in the debugger!).
2617    local $usercontext = _calc_usercontext($package);
2618
2619    # Create an alias to the active file magical array to simplify
2620    # the code here.
2621    local (*dbline) = $main::{ '_<' . $filename };
2622
2623    # Last line in the program.
2624    $max = $#dbline;
2625
2626    # The &-call is here to ascertain the mutability of @_.
2627    &_DB__determine_if_we_should_break;
2628
2629    # Preserve the current stop-or-not, and see if any of the W
2630    # (watch expressions) has changed.
2631    my $was_signal = $signal;
2632
2633    # If we have any watch expressions ...
2634    _DB__handle_watch_expressions($obj);
2635
2636=head2 C<watchfunction()>
2637
2638C<watchfunction()> is a function that can be defined by the user; it is a
2639function which will be run on each entry to C<DB::DB>; it gets the
2640current package, filename, and line as its parameters.
2641
2642The watchfunction can do anything it likes; it is executing in the
2643debugger's context, so it has access to all of the debugger's internal
2644data structures and functions.
2645
2646C<watchfunction()> can control the debugger's actions. Any of the following
2647will cause the debugger to return control to the user's program after
2648C<watchfunction()> executes:
2649
2650=over 4
2651
2652=item *
2653
2654Returning a false value from the C<watchfunction()> itself.
2655
2656=item *
2657
2658Altering C<$single> to a false value.
2659
2660=item *
2661
2662Altering C<$signal> to a false value.
2663
2664=item *
2665
2666Turning off the C<4> bit in C<$trace> (this also disables the
2667check for C<watchfunction()>. This can be done with
2668
2669    $trace &= ~4;
2670
2671=back
2672
2673=cut
2674
2675    # If there's a user-defined DB::watchfunction, call it with the
2676    # current package, filename, and line. The function executes in
2677    # the DB:: package.
2678    if ( $trace & 4 ) {    # User-installed watch
2679        return
2680          if watchfunction( $package, $filename, $line )
2681          and not $single
2682          and not $was_signal
2683          and not( $trace & ~4 );
2684    } ## end if ($trace & 4)
2685
2686    # Pick up any alteration to $signal in the watchfunction, and
2687    # turn off the signal now.
2688    $was_signal = $signal;
2689    $signal     = 0;
2690
2691=head2 GETTING READY TO EXECUTE COMMANDS
2692
2693The debugger decides to take control if single-step mode is on, the
2694C<t> command was entered, or the user generated a signal. If the program
2695has fallen off the end, we set things up so that entering further commands
2696won't cause trouble, and we say that the program is over.
2697
2698=cut
2699
2700    # Make sure that we always print if asked for explicitly regardless
2701    # of $trace_to_depth .
2702    $explicit_stop = ($single || $was_signal);
2703
2704    # Check to see if we should grab control ($single true,
2705    # trace set appropriately, or we got a signal).
2706    if ( $explicit_stop || ( $trace & 1 ) ) {
2707        $obj->_DB__grab_control(@_);
2708    } ## end if ($single || ($trace...
2709
2710=pod
2711
2712If there's an action to be executed for the line we stopped at, execute it.
2713If there are any preprompt actions, execute those as well.
2714
2715=cut
2716
2717    # If there's an action, do it now.
2718    if ($action) {
2719        $evalarg = $action;
2720        # The &-call is here to ascertain the mutability of @_.
2721        &DB::eval;
2722    }
2723
2724    # Are we nested another level (e.g., did we evaluate a function
2725    # that had a breakpoint in it at the debugger prompt)?
2726    if ( $single || $was_signal ) {
2727
2728        # Yes, go down a level.
2729        local $level = $level + 1;
2730
2731        # Do any pre-prompt actions.
2732        foreach $evalarg (@$pre) {
2733            # The &-call is here to ascertain the mutability of @_.
2734            &DB::eval;
2735        }
2736
2737        # Complain about too much recursion if we passed the limit.
2738        if ($single & 4) {
2739            print $OUT $stack_depth . " levels deep in subroutine calls!\n";
2740        }
2741
2742        # The line we're currently on. Set $incr to -1 to stay here
2743        # until we get a command that tells us to advance.
2744        $start = $line;
2745        $incr  = -1;      # for backward motion.
2746
2747        # Tack preprompt debugger actions ahead of any actual input.
2748        @typeahead = ( @$pretype, @typeahead );
2749
2750=head2 WHERE ARE WE?
2751
2752XXX Relocate this section?
2753
2754The debugger normally shows the line corresponding to the current line of
2755execution. Sometimes, though, we want to see the next line, or to move elsewhere
2756in the file. This is done via the C<$incr>, C<$start>, and C<$max> variables.
2757
2758C<$incr> controls by how many lines the I<current> line should move forward
2759after a command is executed. If set to -1, this indicates that the I<current>
2760line shouldn't change.
2761
2762C<$start> is the I<current> line. It is used for things like knowing where to
2763move forwards or backwards from when doing an C<L> or C<-> command.
2764
2765C<$max> tells the debugger where the last line of the current file is. It's
2766used to terminate loops most often.
2767
2768=head2 THE COMMAND LOOP
2769
2770Most of C<DB::DB> is actually a command parsing and dispatch loop. It comes
2771in two parts:
2772
2773=over 4
2774
2775=item *
2776
2777The outer part of the loop, starting at the C<CMD> label. This loop
2778reads a command and then executes it.
2779
2780=item *
2781
2782The inner part of the loop, starting at the C<PIPE> label. This part
2783is wholly contained inside the C<CMD> block and only executes a command.
2784Used to handle commands running inside a pager.
2785
2786=back
2787
2788So why have two labels to restart the loop? Because sometimes, it's easier to
2789have a command I<generate> another command and then re-execute the loop to do
2790the new command. This is faster, but perhaps a bit more convoluted.
2791
2792=cut
2793
2794        # The big command dispatch loop. It keeps running until the
2795        # user yields up control again.
2796        #
2797        # If we have a terminal for input, and we get something back
2798        # from readline(), keep on processing.
2799
2800      CMD:
2801        while (_DB__read_next_cmd($tid))
2802        {
2803
2804            share($cmd);
2805            # ... try to execute the input as debugger commands.
2806
2807            # Don't stop running.
2808            $single = 0;
2809
2810            # No signal is active.
2811            $signal = 0;
2812
2813            # Handle continued commands (ending with \):
2814            if ($cmd =~ s/\\\z/\n/) {
2815                $cmd .= DB::readline("  cont: ");
2816                redo CMD;
2817            }
2818
2819=head4 The null command
2820
2821A newline entered by itself means I<re-execute the last command>. We grab the
2822command out of C<$laststep> (where it was recorded previously), and copy it
2823back into C<$cmd> to be executed below. If there wasn't any previous command,
2824we'll do nothing below (no command will match). If there was, we also save it
2825in the command history and fall through to allow the command parsing to pick
2826it up.
2827
2828=cut
2829
2830            # Empty input means repeat the last command.
2831            if ($cmd eq '') {
2832                $cmd = $laststep;
2833            }
2834            chomp($cmd);    # get rid of the annoying extra newline
2835            if (length($cmd) >= 2) {
2836                push( @hist, $cmd );
2837            }
2838            push( @truehist, $cmd );
2839            share(@hist);
2840            share(@truehist);
2841
2842            # This is a restart point for commands that didn't arrive
2843            # via direct user input. It allows us to 'redo PIPE' to
2844            # re-execute command processing without reading a new command.
2845          PIPE: {
2846                _DB__trim_command_and_return_first_component($obj);
2847
2848=head3 COMMAND ALIASES
2849
2850The debugger can create aliases for commands (these are stored in the
2851C<%alias> hash). Before a command is executed, the command loop looks it up
2852in the alias hash and substitutes the contents of the alias for the command,
2853completely replacing it.
2854
2855=cut
2856
2857                # See if there's an alias for the command, and set it up if so.
2858                if ( $alias{$cmd_verb} ) {
2859
2860                    # Squelch signal handling; we want to keep control here
2861                    # if something goes loco during the alias eval.
2862                    local $SIG{__DIE__};
2863                    local $SIG{__WARN__};
2864
2865                    # This is a command, so we eval it in the DEBUGGER's
2866                    # scope! Otherwise, we can't see the special debugger
2867                    # variables, or get to the debugger's subs. (Well, we
2868                    # _could_, but why make it even more complicated?)
2869                    eval "\$cmd =~ $alias{$cmd_verb}";
2870                    if ($@) {
2871                        local $\ = '';
2872                        print $OUT "Couldn't evaluate '$cmd_verb' alias: $@";
2873                        next CMD;
2874                    }
2875                    _DB__trim_command_and_return_first_component($obj);
2876                } ## end if ($alias{$cmd_verb})
2877
2878=head3 MAIN-LINE COMMANDS
2879
2880All of these commands work up to and after the program being debugged has
2881terminated.
2882
2883=head4 C<q> - quit
2884
2885Quit the debugger. This entails setting the C<$fall_off_end> flag, so we don't
2886try to execute further, cleaning any restart-related stuff out of the
2887environment, and executing with the last value of C<$?>.
2888
2889=cut
2890
2891                # All of these commands were remapped in perl 5.8.0;
2892                # we send them off to the secondary dispatcher (see below).
2893                $obj->_handle_special_char_cmd_wrapper_commands;
2894                _DB__trim_command_and_return_first_component($obj);
2895
2896                if (my $cmd_rec = $cmd_lookup{$cmd_verb}) {
2897                    my $type = $cmd_rec->{t};
2898                    my $val = $cmd_rec->{v};
2899                    if ($type eq 'm') {
2900                        $obj->$val();
2901                    }
2902                    elsif ($type eq 's') {
2903                        $val->($obj);
2904                    }
2905                }
2906
2907=head4 C<t> - trace [n]
2908
2909Turn tracing on or off. Inverts the appropriate bit in C<$trace> (q.v.).
2910If level is specified, set C<$trace_to_depth>.
2911
2912=head4 C<S> - list subroutines matching/not matching a pattern
2913
2914Walks through C<%sub>, checking to see whether or not to print the name.
2915
2916=head4 C<X> - list variables in current package
2917
2918Since the C<V> command actually processes this, just change this to the
2919appropriate C<V> command and fall through.
2920
2921=head4 C<V> - list variables
2922
2923Uses C<dumpvar.pl> to dump out the current values for selected variables.
2924
2925=head4 C<x> - evaluate and print an expression
2926
2927Hands the expression off to C<DB::eval>, setting it up to print the value
2928via C<dumpvar.pl> instead of just printing it directly.
2929
2930=head4 C<m> - print methods
2931
2932Just uses C<DB::methods> to determine what methods are available.
2933
2934=head4 C<f> - switch files
2935
2936Switch to a different filename.
2937
2938=head4 C<.> - return to last-executed line.
2939
2940We set C<$incr> to -1 to indicate that the debugger shouldn't move ahead,
2941and then we look up the line in the magical C<%dbline> hash.
2942
2943=head4 C<-> - back one window
2944
2945We change C<$start> to be one window back; if we go back past the first line,
2946we set it to be the first line. We set C<$incr> to put us back at the
2947currently-executing line, and then put a C<l $start +> (list one window from
2948C<$start>) in C<$cmd> to be executed later.
2949
2950=head3 PRE-580 COMMANDS VS. NEW COMMANDS: C<a, A, b, B, h, l, L, M, o, O, P, v, w, W, E<lt>, E<lt>E<lt>, E<0x7B>, E<0x7B>E<0x7B>>
2951
2952In Perl 5.8.0, a realignment of the commands was done to fix up a number of
2953problems, most notably that the default case of several commands destroying
2954the user's work in setting watchpoints, actions, etc. We wanted, however, to
2955retain the old commands for those who were used to using them or who preferred
2956them. At this point, we check for the new commands and call C<cmd_wrapper> to
2957deal with them instead of processing them in-line.
2958
2959=head4 C<y> - List lexicals in higher scope
2960
2961Uses C<PadWalker> to find the lexicals supplied as arguments in a scope
2962above the current one and then displays then using C<dumpvar.pl>.
2963
2964=head3 COMMANDS NOT WORKING AFTER PROGRAM ENDS
2965
2966All of the commands below this point don't work after the program being
2967debugged has ended. All of them check to see if the program has ended; this
2968allows the commands to be relocated without worrying about a 'line of
2969demarcation' above which commands can be entered anytime, and below which
2970they can't.
2971
2972=head4 C<n> - single step, but don't trace down into subs
2973
2974Done by setting C<$single> to 2, which forces subs to execute straight through
2975when entered (see C<DB::sub>). We also save the C<n> command in C<$laststep>,
2976so a null command knows what to re-execute.
2977
2978=head4 C<s> - single-step, entering subs
2979
2980Sets C<$single> to 1, which causes C<DB::sub> to continue tracing inside
2981subs. Also saves C<s> as C<$lastcmd>.
2982
2983=head4 C<c> - run continuously, setting an optional breakpoint
2984
2985Most of the code for this command is taken up with locating the optional
2986breakpoint, which is either a subroutine name or a line number. We set
2987the appropriate one-time-break in C<@dbline> and then turn off single-stepping
2988in this and all call levels above this one.
2989
2990=head4 C<r> - return from a subroutine
2991
2992For C<r> to work properly, the debugger has to stop execution again
2993immediately after the return is executed. This is done by forcing
2994single-stepping to be on in the call level above the current one. If
2995we are printing return values when a C<r> is executed, set C<$doret>
2996appropriately, and force us out of the command loop.
2997
2998=head4 C<T> - stack trace
2999
3000Just calls C<DB::print_trace>.
3001
3002=head4 C<w> - List window around current line.
3003
3004Just calls C<DB::cmd_w>.
3005
3006=head4 C<W> - watch-expression processing.
3007
3008Just calls C<DB::cmd_W>.
3009
3010=head4 C</> - search forward for a string in the source
3011
3012We take the argument and treat it as a pattern. If it turns out to be a
3013bad one, we return the error we got from trying to C<eval> it and exit.
3014If not, we create some code to do the search and C<eval> it so it can't
3015mess us up.
3016
3017=cut
3018
3019                _DB__handle_forward_slash_command($obj);
3020
3021=head4 C<?> - search backward for a string in the source
3022
3023Same as for C</>, except the loop runs backwards.
3024
3025=cut
3026
3027                _DB__handle_question_mark_command($obj);
3028
3029=head4 C<$rc> - Recall command
3030
3031Manages the commands in C<@hist> (which is created if C<Term::ReadLine> reports
3032that the terminal supports history). It finds the command required, puts it
3033into C<$cmd>, and redoes the loop to execute it.
3034
3035=cut
3036
3037                # $rc - recall command.
3038                $obj->_handle_rc_recall_command;
3039
3040=head4 C<$sh$sh> - C<system()> command
3041
3042Calls the C<_db_system()> to handle the command. This keeps the C<STDIN> and
3043C<STDOUT> from getting messed up.
3044
3045=cut
3046
3047                $obj->_handle_sh_command;
3048
3049=head4 C<$rc I<pattern> $rc> - Search command history
3050
3051Another command to manipulate C<@hist>: this one searches it with a pattern.
3052If a command is found, it is placed in C<$cmd> and executed via C<redo>.
3053
3054=cut
3055
3056                $obj->_handle_rc_search_history_command;
3057
3058=head4 C<$sh> - Invoke a shell
3059
3060Uses C<_db_system()> to invoke a shell.
3061
3062=cut
3063
3064=head4 C<$sh I<command>> - Force execution of a command in a shell
3065
3066Like the above, but the command is passed to the shell. Again, we use
3067C<_db_system()> to avoid problems with C<STDIN> and C<STDOUT>.
3068
3069=head4 C<H> - display commands in history
3070
3071Prints the contents of C<@hist> (if any).
3072
3073=head4 C<man, doc, perldoc> - look up documentation
3074
3075Just calls C<runman()> to print the appropriate document.
3076
3077=cut
3078
3079                $obj->_handle_doc_command;
3080
3081=head4 C<p> - print
3082
3083Builds a C<print EXPR> expression in the C<$cmd>; this will get executed at
3084the bottom of the loop.
3085
3086=head4 C<=> - define command alias
3087
3088Manipulates C<%alias> to add or list command aliases.
3089
3090=head4 C<source> - read commands from a file.
3091
3092Opens a lexical filehandle and stacks it on C<@cmdfhs>; C<DB::readline> will
3093pick it up.
3094
3095=head4 C<enable> C<disable> - enable or disable breakpoints
3096
3097This enables or disables breakpoints.
3098
3099=head4 C<save> - send current history to a file
3100
3101Takes the complete history, (not the shrunken version you see with C<H>),
3102and saves it to the given filename, so it can be replayed using C<source>.
3103
3104Note that all C<^(save|source)>'s are commented out with a view to minimise recursion.
3105
3106=head4 C<R> - restart
3107
3108Restart the debugger session.
3109
3110=head4 C<rerun> - rerun the current session
3111
3112Return to any given position in the B<true>-history list
3113
3114=head4 C<|, ||> - pipe output through the pager.
3115
3116For C<|>, we save C<OUT> (the debugger's output filehandle) and C<STDOUT>
3117(the program's standard output). For C<||>, we only save C<OUT>. We open a
3118pipe to the pager (restoring the output filehandles if this fails). If this
3119is the C<|> command, we also set up a C<SIGPIPE> handler which will simply
3120set C<$signal>, sending us back into the debugger.
3121
3122We then trim off the pipe symbols and C<redo> the command loop at the
3123C<PIPE> label, causing us to evaluate the command in C<$cmd> without
3124reading another.
3125
3126=cut
3127
3128                # || - run command in the pager, with output to DB::OUT.
3129                _DB__handle_run_command_in_pager_command($obj);
3130
3131=head3 END OF COMMAND PARSING
3132
3133Anything left in C<$cmd> at this point is a Perl expression that we want to
3134evaluate. We'll always evaluate in the user's context, and fully qualify
3135any variables we might want to address in the C<DB> package.
3136
3137=cut
3138
3139            }    # PIPE:
3140
3141            # trace an expression
3142            $cmd =~ s/^t\s/\$DB::trace |= 1;\n/;
3143
3144            # Make sure the flag that says "the debugger's running" is
3145            # still on, to make sure we get control again.
3146            $evalarg = "\$^D = \$^D | \$DB::db_stop;\n$cmd";
3147
3148            # Run *our* eval that executes in the caller's context.
3149            # The &-call is here to ascertain the mutability of @_.
3150            &DB::eval;
3151
3152            # Turn off the one-time-dump stuff now.
3153            if ($onetimeDump) {
3154                $onetimeDump      = undef;
3155                $onetimedumpDepth = undef;
3156            }
3157            elsif ( $term_pid == $$ ) {
3158                eval { # May run under miniperl, when not available...
3159                    STDOUT->flush();
3160                    STDERR->flush();
3161                };
3162
3163                # XXX If this is the master pid, print a newline.
3164                print {$OUT} "\n";
3165            }
3166        } ## end while (($term || &setterm...
3167
3168=head3 POST-COMMAND PROCESSING
3169
3170After each command, we check to see if the command output was piped anywhere.
3171If so, we go through the necessary code to unhook the pipe and go back to
3172our standard filehandles for input and output.
3173
3174=cut
3175
3176        continue {    # CMD:
3177            _DB__at_end_of_every_command($obj);
3178        }    # CMD:
3179
3180=head3 COMMAND LOOP TERMINATION
3181
3182When commands have finished executing, we come here. If the user closed the
3183input filehandle, we turn on C<$fall_off_end> to emulate a C<q> command. We
3184evaluate any post-prompt items. We restore C<$@>, C<$!>, C<$^E>, C<$,>, C<$/>,
3185C<$\>, and C<$^W>, and return a null list as expected by the Perl interpreter.
3186The interpreter will then execute the next line and then return control to us
3187again.
3188
3189=cut
3190
3191        # No more commands? Quit.
3192        $fall_off_end = 1 unless defined $cmd;    # Emulate 'q' on EOF
3193
3194        # Evaluate post-prompt commands.
3195        foreach $evalarg (@$post) {
3196            # The &-call is here to ascertain the mutability of @_.
3197            &DB::eval;
3198        }
3199    }    # if ($single || $signal)
3200
3201    # Put the user's globals back where you found them.
3202    ( $@, $!, $^E, $,, $/, $\, $^W ) = @saved;
3203    ();
3204} ## end sub DB
3205
3206# Because DB::Obj is used above,
3207#
3208#   my $obj = DB::Obj->new(
3209#
3210# The following package declaration must come before that,
3211# or else runtime errors will occur with
3212#
3213#   PERLDB_OPTS="autotrace nonstop"
3214#
3215# ( rt#116771 )
3216BEGIN {
3217
3218package DB::Obj;
3219
3220sub new {
3221    my $class = shift;
3222
3223    my $self = bless {}, $class;
3224
3225    $self->_init(@_);
3226
3227    return $self;
3228}
3229
3230sub _init {
3231    my ($self, $args) = @_;
3232
3233    %{$self} = (%$self, %$args);
3234
3235    return;
3236}
3237
3238{
3239    no strict 'refs';
3240    foreach my $slot_name (qw(
3241        after explicit_stop infix pat piped position prefix selected cmd_verb
3242        cmd_args
3243        )) {
3244        my $slot = $slot_name;
3245        *{$slot} = sub {
3246            my $self = shift;
3247
3248            if (@_) {
3249                ${ $self->{$slot} } = shift;
3250            }
3251
3252            return ${ $self->{$slot} };
3253        };
3254
3255        *{"append_to_$slot"} = sub {
3256            my $self = shift;
3257            my $s = shift;
3258
3259            return $self->$slot($self->$slot . $s);
3260        };
3261    }
3262}
3263
3264sub _DB_on_init__initialize_globals
3265{
3266    my $self = shift;
3267
3268    # Check for whether we should be running continuously or not.
3269    # _After_ the perl program is compiled, $single is set to 1:
3270    if ( $single and not $second_time++ ) {
3271
3272        # Options say run non-stop. Run until we get an interrupt.
3273        if ($runnonstop) {    # Disable until signal
3274                # If there's any call stack in place, turn off single
3275                # stepping into subs throughout the stack.
3276            for my $i (0 .. $stack_depth) {
3277                $stack[ $i ] &= ~1;
3278            }
3279
3280            # And we are now no longer in single-step mode.
3281            $single = 0;
3282
3283            # If we simply returned at this point, we wouldn't get
3284            # the trace info. Fall on through.
3285            # return;
3286        } ## end if ($runnonstop)
3287
3288        elsif ($ImmediateStop) {
3289
3290            # We are supposed to stop here; XXX probably a break.
3291            $ImmediateStop = 0;    # We've processed it; turn it off
3292            $signal        = 1;    # Simulate an interrupt to force
3293                                   # us into the command loop
3294        }
3295    } ## end if ($single and not $second_time...
3296
3297    # If we're in single-step mode, or an interrupt (real or fake)
3298    # has occurred, turn off non-stop mode.
3299    $runnonstop = 0 if $single or $signal;
3300
3301    return;
3302}
3303
3304sub _my_print_lineinfo
3305{
3306    my ($self, $i, $incr_pos) = @_;
3307
3308    if ($frame) {
3309        # Print it indented if tracing is on.
3310        DB::print_lineinfo( ' ' x $stack_depth,
3311            "$i:\t$DB::dbline[$i]" . $self->after );
3312    }
3313    else {
3314        DB::depth_print_lineinfo($self->explicit_stop, $incr_pos);
3315    }
3316}
3317
3318sub _curr_line {
3319    return $DB::dbline[$line];
3320}
3321
3322sub _is_full {
3323    my ($self, $letter) = @_;
3324
3325    return ($DB::cmd eq $letter);
3326}
3327
3328sub _DB__grab_control
3329{
3330    my $self = shift;
3331
3332    # Yes, grab control.
3333    if ($slave_editor) {
3334
3335        # Tell the editor to update its position.
3336        $self->position("\032\032${DB::filename}:$line:0\n");
3337        DB::print_lineinfo($self->position());
3338    }
3339
3340=pod
3341
3342Special check: if we're in package C<DB::fake>, we've gone through the
3343C<END> block at least once. We set up everything so that we can continue
3344to enter commands and have a valid context to be in.
3345
3346=cut
3347
3348    elsif ( $DB::package eq 'DB::fake' ) {
3349
3350        # Fallen off the end already.
3351        if (!$DB::term) {
3352            DB::setterm();
3353        }
3354
3355        DB::print_help(<<EOP);
3356Debugged program terminated.  Use B<q> to quit or B<R> to restart,
3357use B<o> I<inhibit_exit> to avoid stopping after program termination,
3358B<h q>, B<h R> or B<h o> to get additional info.
3359EOP
3360
3361        # Set the DB::eval context appropriately.
3362        # At program termination disable any user actions.
3363        $DB::action = undef;
3364
3365        $DB::package     = 'main';
3366        $DB::usercontext = DB::_calc_usercontext($DB::package);
3367    } ## end elsif ($package eq 'DB::fake')
3368
3369=pod
3370
3371If the program hasn't finished executing, we scan forward to the
3372next executable line, print that out, build the prompt from the file and line
3373number information, and print that.
3374
3375=cut
3376
3377    else {
3378
3379
3380        # Still somewhere in the midst of execution. Set up the
3381        #  debugger prompt.
3382        $DB::sub =~ s/\'/::/;    # Swap Perl 4 package separators (') to
3383                             # Perl 5 ones (sorry, we don't print Klingon
3384                             #module names)
3385
3386        $self->prefix($DB::sub =~ /::/ ? "" : ($DB::package . '::'));
3387        $self->append_to_prefix( "$DB::sub(${DB::filename}:" );
3388        $self->after( $self->_curr_line =~ /\n$/ ? '' : "\n" );
3389
3390        # Break up the prompt if it's really long.
3391        if ( length($self->prefix()) > 30 ) {
3392            $self->position($self->prefix . "$line):\n$line:\t" . $self->_curr_line . $self->after);
3393            $self->prefix("");
3394            $self->infix(":\t");
3395        }
3396        else {
3397            $self->infix("):\t");
3398            $self->position(
3399                $self->prefix . $line. $self->infix
3400                . $self->_curr_line . $self->after
3401            );
3402        }
3403
3404        # Print current line info, indenting if necessary.
3405        $self->_my_print_lineinfo($line, $self->position);
3406
3407        my $i;
3408        my $line_i = sub { return $DB::dbline[$i]; };
3409
3410        # Scan forward, stopping at either the end or the next
3411        # unbreakable line.
3412        for ( $i = $line + 1 ; $i <= $DB::max && $line_i->() == 0 ; ++$i )
3413        {    #{ vi
3414
3415            # Drop out on null statements, block closers, and comments.
3416            last if $line_i->() =~ /^\s*[\;\}\#\n]/;
3417
3418            # Drop out if the user interrupted us.
3419            last if $signal;
3420
3421            # Append a newline if the line doesn't have one. Can happen
3422            # in eval'ed text, for instance.
3423            $self->after( $line_i->() =~ /\n$/ ? '' : "\n" );
3424
3425            # Next executable line.
3426            my $incr_pos = $self->prefix . $i . $self->infix . $line_i->()
3427                . $self->after;
3428            $self->append_to_position($incr_pos);
3429            $self->_my_print_lineinfo($i, $incr_pos);
3430        } ## end for ($i = $line + 1 ; $i...
3431    } ## end else [ if ($slave_editor)
3432
3433    return;
3434}
3435
3436sub _handle_t_command {
3437    my $self = shift;
3438
3439    my $levels = $self->cmd_args();
3440
3441    if ((!length($levels)) or ($levels !~ /\D/)) {
3442        $trace ^= 1;
3443        local $\ = '';
3444        $DB::trace_to_depth = $levels ? $stack_depth + $levels : 1E9;
3445        print {$OUT} "Trace = "
3446        . ( ( $trace & 1 )
3447            ? ( $levels ? "on (to level $DB::trace_to_depth)" : "on" )
3448            : "off" ) . "\n";
3449        next CMD;
3450    }
3451
3452    return;
3453}
3454
3455
3456sub _handle_S_command {
3457    my $self = shift;
3458
3459    if (my ($print_all_subs, $should_reverse, $Spatt)
3460        = $self->cmd_args =~ /\A((!)?(.+))?\z/) {
3461        # $Spatt is the pattern (if any) to use.
3462        # Reverse scan?
3463        my $Srev     = defined $should_reverse;
3464        # No args - print all subs.
3465        my $Snocheck = !defined $print_all_subs;
3466
3467        # Need to make these sane here.
3468        local $\ = '';
3469        local $, = '';
3470
3471        # Search through the debugger's magical hash of subs.
3472        # If $nocheck is true, just print the sub name.
3473        # Otherwise, check it against the pattern. We then use
3474        # the XOR trick to reverse the condition as required.
3475        foreach $subname ( sort( keys %sub ) ) {
3476            if ( $Snocheck or $Srev ^ ( $subname =~ /$Spatt/ ) ) {
3477                print $OUT $subname, "\n";
3478            }
3479        }
3480        next CMD;
3481    }
3482
3483    return;
3484}
3485
3486sub _handle_V_command_and_X_command {
3487    my $self = shift;
3488
3489    $DB::cmd =~ s/^X\b/V $DB::package/;
3490
3491    # Bare V commands get the currently-being-debugged package
3492    # added.
3493    if ($self->_is_full('V')) {
3494        $DB::cmd = "V $DB::package";
3495    }
3496
3497    # V - show variables in package.
3498    if (my ($new_packname, $new_vars_str) =
3499        $DB::cmd =~ /\AV\b\s*(\S+)\s*(.*)/) {
3500
3501        # Save the currently selected filehandle and
3502        # force output to debugger's filehandle (dumpvar
3503        # just does "print" for output).
3504        my $savout = select($OUT);
3505
3506        # Grab package name and variables to dump.
3507        $packname = $new_packname;
3508        my @vars     = split( ' ', $new_vars_str );
3509
3510        # If main::dumpvar isn't here, get it.
3511        do 'dumpvar.pl' || die $@ unless defined &main::dumpvar;
3512        if ( defined &main::dumpvar ) {
3513
3514            # We got it. Turn off subroutine entry/exit messages
3515            # for the moment, along with return values.
3516            local $frame = 0;
3517            local $doret = -2;
3518
3519            # must detect sigpipe failures  - not catching
3520            # then will cause the debugger to die.
3521            eval {
3522                main::dumpvar(
3523                    $packname,
3524                    defined $option{dumpDepth}
3525                    ? $option{dumpDepth}
3526                    : -1,    # assume -1 unless specified
3527                    @vars
3528                );
3529            };
3530
3531            # The die doesn't need to include the $@, because
3532            # it will automatically get propagated for us.
3533            if ($@) {
3534                die unless $@ =~ /dumpvar print failed/;
3535            }
3536        } ## end if (defined &main::dumpvar)
3537        else {
3538
3539            # Couldn't load dumpvar.
3540            print $OUT "dumpvar.pl not available.\n";
3541        }
3542
3543        # Restore the output filehandle, and go round again.
3544        select($savout);
3545        next CMD;
3546    }
3547
3548    return;
3549}
3550
3551sub _handle_dash_command {
3552    my $self = shift;
3553
3554    if ($self->_is_full('-')) {
3555
3556        # back up by a window; go to 1 if back too far.
3557        $start -= $incr + $window + 1;
3558        $start = 1 if $start <= 0;
3559        $incr  = $window - 1;
3560
3561        # Generate and execute a "l +" command (handled below).
3562        $DB::cmd = 'l ' . ($start) . '+';
3563        redo CMD;
3564    }
3565    return;
3566}
3567
3568sub _n_or_s_commands_generic {
3569    my ($self, $new_val) = @_;
3570    # n - next
3571    next CMD if DB::_DB__is_finished();
3572
3573    # Single step, but don't enter subs.
3574    $single = $new_val;
3575
3576    # Save for empty command (repeat last).
3577    $laststep = $DB::cmd;
3578    last CMD;
3579}
3580
3581sub _n_or_s {
3582    my ($self, $letter, $new_val) = @_;
3583
3584    if ($self->_is_full($letter)) {
3585        $self->_n_or_s_commands_generic($new_val);
3586    }
3587    else {
3588        $self->_n_or_s_and_arg_commands_generic($letter, $new_val);
3589    }
3590
3591    return;
3592}
3593
3594sub _handle_n_command {
3595    my $self = shift;
3596
3597    return $self->_n_or_s('n', 2);
3598}
3599
3600sub _handle_s_command {
3601    my $self = shift;
3602
3603    return $self->_n_or_s('s', 1);
3604}
3605
3606sub _handle_r_command {
3607    my $self = shift;
3608
3609    # r - return from the current subroutine.
3610    if ($self->_is_full('r')) {
3611
3612        # Can't do anything if the program's over.
3613        next CMD if DB::_DB__is_finished();
3614
3615        # Turn on stack trace.
3616        $stack[$stack_depth] |= 1;
3617
3618        # Print return value unless the stack is empty.
3619        $doret = $option{PrintRet} ? $stack_depth - 1 : -2;
3620        last CMD;
3621    }
3622
3623    return;
3624}
3625
3626sub _handle_T_command {
3627    my $self = shift;
3628
3629    if ($self->_is_full('T')) {
3630        DB::print_trace( $OUT, 1 );    # skip DB
3631        next CMD;
3632    }
3633
3634    return;
3635}
3636
3637sub _handle_w_command {
3638    my $self = shift;
3639
3640    DB::cmd_w( 'w', $self->cmd_args() );
3641    next CMD;
3642
3643    return;
3644}
3645
3646sub _handle_W_command {
3647    my $self = shift;
3648
3649    if (my $arg = $self->cmd_args) {
3650        DB::cmd_W( 'W', $arg );
3651        next CMD;
3652    }
3653
3654    return;
3655}
3656
3657sub _handle_rc_recall_command {
3658    my $self = shift;
3659
3660    # $rc - recall command.
3661    if (my ($minus, $arg) = $DB::cmd =~ m#\A$rc+\s*(-)?(\d+)?\z#) {
3662
3663        # No arguments, take one thing off history.
3664        pop(@hist) if length($DB::cmd) > 1;
3665
3666        # Relative (- found)?
3667        #  Y - index back from most recent (by 1 if bare minus)
3668        #  N - go to that particular command slot or the last
3669        #      thing if nothing following.
3670
3671        $self->cmd_verb(
3672            scalar($minus ? ( $#hist - ( $arg || 1 ) ) : ( $arg || $#hist ))
3673        );
3674
3675        # Pick out the command desired.
3676        $DB::cmd = $hist[$self->cmd_verb];
3677
3678        # Print the command to be executed and restart the loop
3679        # with that command in the buffer.
3680        print {$OUT} $DB::cmd, "\n";
3681        redo CMD;
3682    }
3683
3684    return;
3685}
3686
3687sub _handle_rc_search_history_command {
3688    my $self = shift;
3689
3690    # $rc pattern $rc - find a command in the history.
3691    if (my ($arg) = $DB::cmd =~ /\A$rc([^$rc].*)\z/) {
3692
3693        # Create the pattern to use.
3694        my $pat = "^$arg";
3695        $self->pat($pat);
3696
3697        # Toss off last entry if length is >1 (and it always is).
3698        pop(@hist) if length($DB::cmd) > 1;
3699
3700        my $i;
3701
3702        # Look backward through the history.
3703        SEARCH_HIST:
3704        for ( $i = $#hist ; $i ; --$i ) {
3705            # Stop if we find it.
3706            last SEARCH_HIST if $hist[$i] =~ /$pat/;
3707        }
3708
3709        if ( !$i ) {
3710
3711            # Never found it.
3712            print $OUT "No such command!\n\n";
3713            next CMD;
3714        }
3715
3716        # Found it. Put it in the buffer, print it, and process it.
3717        $DB::cmd = $hist[$i];
3718        print $OUT $DB::cmd, "\n";
3719        redo CMD;
3720    }
3721
3722    return;
3723}
3724
3725sub _handle_H_command {
3726    my $self = shift;
3727
3728    if ($self->cmd_args =~ m#\A\*#) {
3729        @hist = @truehist = ();
3730        print $OUT "History cleansed\n";
3731        next CMD;
3732    }
3733
3734    if (my ($num) = $self->cmd_args =~ /\A(?:-(\d+))?/) {
3735
3736        # Anything other than negative numbers is ignored by
3737        # the (incorrect) pattern, so this test does nothing.
3738        $end = $num ? ( $#hist - $num ) : 0;
3739
3740        # Set to the minimum if less than zero.
3741        $hist = 0 if $hist < 0;
3742
3743        # Start at the end of the array.
3744        # Stay in while we're still above the ending value.
3745        # Tick back by one each time around the loop.
3746        my $i;
3747
3748        for ( $i = $#hist ; $i > $end ; $i-- ) {
3749
3750            # Print the command  unless it has no arguments.
3751            print $OUT "$i: ", $hist[$i], "\n"
3752            unless $hist[$i] =~ /^.?$/;
3753        }
3754
3755        next CMD;
3756    }
3757
3758    return;
3759}
3760
3761sub _handle_doc_command {
3762    my $self = shift;
3763
3764    # man, perldoc, doc - show manual pages.
3765    if (my ($man_page)
3766        = $DB::cmd =~ /\A(?:man|(?:perl)?doc)\b(?:\s+([^(]*))?\z/) {
3767        DB::runman($man_page);
3768        next CMD;
3769    }
3770
3771    return;
3772}
3773
3774sub _handle_p_command {
3775    my $self = shift;
3776
3777    my $print_cmd = 'print {$DB::OUT} ';
3778    # p - print (no args): print $_.
3779    if ($self->_is_full('p')) {
3780        $DB::cmd = $print_cmd . '$_';
3781    }
3782    else {
3783        # p - print the given expression.
3784        $DB::cmd =~ s/\Ap\b/$print_cmd /;
3785    }
3786
3787    return;
3788}
3789
3790sub _handle_equal_sign_command {
3791    my $self = shift;
3792
3793    if ($DB::cmd =~ s/\A=\s*//) {
3794        my @keys;
3795        if ( length $DB::cmd == 0 ) {
3796
3797            # No args, get current aliases.
3798            @keys = sort keys %alias;
3799        }
3800        elsif ( my ( $k, $v ) = ( $DB::cmd =~ /^(\S+)\s+(\S.*)/ ) ) {
3801
3802            # Creating a new alias. $k is alias name, $v is
3803            # alias value.
3804
3805            # can't use $_ or kill //g state
3806            for my $x ( $k, $v ) {
3807
3808                # Escape "alarm" characters.
3809                $x =~ s/\a/\\a/g;
3810            }
3811
3812            # Substitute key for value, using alarm chars
3813            # as separators (which is why we escaped them in
3814            # the command).
3815            $alias{$k} = "s\a$k\a$v\a";
3816
3817            # Turn off standard warn and die behavior.
3818            local $SIG{__DIE__};
3819            local $SIG{__WARN__};
3820
3821            # Is it valid Perl?
3822            unless ( eval "sub { s\a$k\a$v\a }; 1" ) {
3823
3824                # Nope. Bad alias. Say so and get out.
3825                print $OUT "Can't alias $k to $v: $@\n";
3826                delete $alias{$k};
3827                next CMD;
3828            }
3829
3830            # We'll only list the new one.
3831            @keys = ($k);
3832        } ## end elsif (my ($k, $v) = ($DB::cmd...
3833
3834        # The argument is the alias to list.
3835        else {
3836            @keys = ($DB::cmd);
3837        }
3838
3839        # List aliases.
3840        for my $k (@keys) {
3841
3842            # Messy metaquoting: Trim the substitution code off.
3843            # We use control-G as the delimiter because it's not
3844            # likely to appear in the alias.
3845            if ( ( my $v = $alias{$k} ) =~ ss\a$k\a(.*)\a$1 ) {
3846
3847                # Print the alias.
3848                print $OUT "$k\t= $1\n";
3849            }
3850            elsif ( defined $alias{$k} ) {
3851
3852                # Couldn't trim it off; just print the alias code.
3853                print $OUT "$k\t$alias{$k}\n";
3854            }
3855            else {
3856
3857                # No such, dude.
3858                print "No alias for $k\n";
3859            }
3860        } ## end for my $k (@keys)
3861        next CMD;
3862    }
3863
3864    return;
3865}
3866
3867sub _handle_source_command {
3868    my $self = shift;
3869
3870    # source - read commands from a file (or pipe!) and execute.
3871    if (my $sourced_fn = $self->cmd_args) {
3872        if ( open my $fh, $sourced_fn ) {
3873
3874            # Opened OK; stick it in the list of file handles.
3875            push @cmdfhs, $fh;
3876        }
3877        else {
3878
3879            # Couldn't open it.
3880            DB::_db_warn("Can't execute '$sourced_fn': $!\n");
3881        }
3882        next CMD;
3883    }
3884
3885    return;
3886}
3887
3888sub _handle_enable_disable_commands {
3889    my $self = shift;
3890
3891    my $which_cmd = $self->cmd_verb;
3892    my $position = $self->cmd_args;
3893
3894    if ($position !~ /\s/) {
3895        my ($fn, $line_num);
3896        if ($position =~ m{\A\d+\z})
3897        {
3898            $fn = $DB::filename;
3899            $line_num = $position;
3900        }
3901        elsif (my ($new_fn, $new_line_num)
3902            = $position =~ m{\A(.*):(\d+)\z}) {
3903            ($fn, $line_num) = ($new_fn, $new_line_num);
3904        }
3905        else
3906        {
3907            DB::_db_warn("Wrong spec for enable/disable argument.\n");
3908        }
3909
3910        if (defined($fn)) {
3911            if (DB::_has_breakpoint_data_ref($fn, $line_num)) {
3912                DB::_set_breakpoint_enabled_status($fn, $line_num,
3913                    ($which_cmd eq 'enable' ? 1 : '')
3914                );
3915            }
3916            else {
3917                DB::_db_warn("No breakpoint set at ${fn}:${line_num}\n");
3918            }
3919        }
3920
3921        next CMD;
3922    }
3923
3924    return;
3925}
3926
3927sub _handle_save_command {
3928    my $self = shift;
3929
3930    if (my $new_fn = $self->cmd_args) {
3931        my $filename = $new_fn || '.perl5dbrc';    # default?
3932        if ( open my $fh, '>', $filename ) {
3933
3934            # chomp to remove extraneous newlines from source'd files
3935            chomp( my @truelist =
3936                map { m/\A\s*(save|source)/ ? "#$_" : $_ }
3937                @truehist );
3938            print {$fh} join( "\n", @truelist );
3939            print "commands saved in $filename\n";
3940        }
3941        else {
3942            DB::_db_warn("Can't save debugger commands in '$new_fn': $!\n");
3943        }
3944        next CMD;
3945    }
3946
3947    return;
3948}
3949
3950sub _n_or_s_and_arg_commands_generic {
3951    my ($self, $letter, $new_val) = @_;
3952
3953    # s - single-step. Remember the last command was 's'.
3954    if ($DB::cmd =~ s#\A\Q$letter\E\s#\$DB::single = $new_val;\n#) {
3955        $laststep = $letter;
3956    }
3957
3958    return;
3959}
3960
3961sub _handle_sh_command {
3962    my $self = shift;
3963
3964    # $sh$sh - run a shell command (if it's all ASCII).
3965    # Can't run shell commands with Unicode in the debugger, hmm.
3966    my $my_cmd = $DB::cmd;
3967    if ($my_cmd =~ m#\A$sh#gms) {
3968
3969        if ($my_cmd =~ m#\G\z#cgms) {
3970            # Run the user's shell. If none defined, run Bourne.
3971            # We resume execution when the shell terminates.
3972            DB::_db_system( $ENV{SHELL} || "/bin/sh" );
3973            next CMD;
3974        }
3975        elsif ($my_cmd =~ m#\G$sh\s*(.*)#cgms) {
3976            # System it.
3977            DB::_db_system($1);
3978            next CMD;
3979        }
3980        elsif ($my_cmd =~ m#\G\s*(.*)#cgms) {
3981            DB::_db_system( $ENV{SHELL} || "/bin/sh", "-c", $1 );
3982            next CMD;
3983        }
3984    }
3985}
3986
3987sub _handle_x_command {
3988    my $self = shift;
3989
3990    if ($DB::cmd =~ s#\Ax\b# #) {    # Remainder gets done by DB::eval()
3991        $onetimeDump = 'dump';    # main::dumpvar shows the output
3992
3993        # handle special  "x 3 blah" syntax XXX propagate
3994        # doc back to special variables.
3995        if ( $DB::cmd =~ s#\A\s*(\d+)(?=\s)# #) {
3996            $onetimedumpDepth = $1;
3997        }
3998    }
3999
4000    return;
4001}
4002
4003sub _handle_q_command {
4004    my $self = shift;
4005
4006    if ($self->_is_full('q')) {
4007        $fall_off_end = 1;
4008        DB::clean_ENV();
4009        exit $?;
4010    }
4011
4012    return;
4013}
4014
4015sub _handle_cmd_wrapper_commands {
4016    my $self = shift;
4017
4018    DB::cmd_wrapper( $self->cmd_verb, $self->cmd_args, $line );
4019    next CMD;
4020}
4021
4022sub _handle_special_char_cmd_wrapper_commands {
4023    my $self = shift;
4024
4025    # All of these commands were remapped in perl 5.8.0;
4026    # we send them off to the secondary dispatcher (see below).
4027    if (my ($cmd_letter, $my_arg) = $DB::cmd =~ /\A([<>\{]{1,2})\s*(.*)/so) {
4028        DB::cmd_wrapper( $cmd_letter, $my_arg, $line );
4029        next CMD;
4030    }
4031
4032    return;
4033}
4034
4035} ## end DB::Obj
4036
4037package DB;
4038
4039# The following code may be executed now:
4040# BEGIN {warn 4}
4041
4042=head2 sub
4043
4044C<sub> is called whenever a subroutine call happens in the program being
4045debugged. The variable C<$DB::sub> contains the name of the subroutine
4046being called.
4047
4048The core function of this subroutine is to actually call the sub in the proper
4049context, capturing its output. This of course causes C<DB::DB> to get called
4050again, repeating until the subroutine ends and returns control to C<DB::sub>
4051again. Once control returns, C<DB::sub> figures out whether or not to dump the
4052return value, and returns its captured copy of the return value as its own
4053return value. The value then feeds back into the program being debugged as if
4054C<DB::sub> hadn't been there at all.
4055
4056C<sub> does all the work of printing the subroutine entry and exit messages
4057enabled by setting C<$frame>. It notes what sub the autoloader got called for,
4058and also prints the return value if needed (for the C<r> command and if
4059the 16 bit is set in C<$frame>).
4060
4061It also tracks the subroutine call depth by saving the current setting of
4062C<$single> in the C<@stack> package global; if this exceeds the value in
4063C<$deep>, C<sub> automatically turns on printing of the current depth by
4064setting the C<4> bit in C<$single>. In any case, it keeps the current setting
4065of stop/don't stop on entry to subs set as it currently is set.
4066
4067=head3 C<caller()> support
4068
4069If C<caller()> is called from the package C<DB>, it provides some
4070additional data, in the following order:
4071
4072=over 4
4073
4074=item * C<$package>
4075
4076The package name the sub was in
4077
4078=item * C<$filename>
4079
4080The filename it was defined in
4081
4082=item * C<$line>
4083
4084The line number it was defined on
4085
4086=item * C<$subroutine>
4087
4088The subroutine name; C<(eval)> if an C<eval>().
4089
4090=item * C<$hasargs>
4091
40921 if it has arguments, 0 if not
4093
4094=item * C<$wantarray>
4095
40961 if array context, 0 if scalar context
4097
4098=item * C<$evaltext>
4099
4100The C<eval>() text, if any (undefined for C<eval BLOCK>)
4101
4102=item * C<$is_require>
4103
4104frame was created by a C<use> or C<require> statement
4105
4106=item * C<$hints>
4107
4108pragma information; subject to change between versions
4109
4110=item * C<$bitmask>
4111
4112pragma information; subject to change between versions
4113
4114=item * C<@DB::args>
4115
4116arguments with which the subroutine was invoked
4117
4118=back
4119
4120=cut
4121
4122use vars qw($deep);
4123
4124# We need to fully qualify the name ("DB::sub") to make "use strict;"
4125# happy. -- Shlomi Fish
4126
4127sub _indent_print_line_info {
4128    my ($offset, $str) = @_;
4129
4130    print_lineinfo( ' ' x ($stack_depth - $offset), $str);
4131
4132    return;
4133}
4134
4135sub _print_frame_message {
4136    my ($al) = @_;
4137
4138    if ($frame) {
4139        if ($frame & 4) {   # Extended frame entry message
4140            _indent_print_line_info(-1, "in  ");
4141
4142            # Why -1? But it works! :-(
4143            # Because print_trace will call add 1 to it and then call
4144            # dump_trace; this results in our skipping -1+1 = 0 stack frames
4145            # in dump_trace.
4146            #
4147            # Now it's 0 because we extracted a function.
4148            print_trace( $LINEINFO, 0, 1, 1, "$sub$al" );
4149        }
4150        else {
4151            _indent_print_line_info(-1, "entering $sub$al\n" );
4152        }
4153    }
4154
4155    return;
4156}
4157
4158sub DB::sub {
4159    my ( $al, $ret, @ret ) = "";
4160
4161    # We stack the stack pointer and then increment it to protect us
4162    # from a situation that might unwind a whole bunch of call frames
4163    # at once. Localizing the stack pointer means that it will automatically
4164    # unwind the same amount when multiple stack frames are unwound.
4165    local $stack_depth = $stack_depth + 1;    # Protect from non-local exits
4166
4167    {
4168        # lock ourselves under threads
4169        # While lock() permits recursive locks, there's two cases where it's bad
4170        # that we keep a hold on the lock while we call the sub:
4171        #  - during cloning, Package::CLONE might be called in the context of the new
4172        #    thread, which will deadlock if we hold the lock across the threads::new call
4173        #  - for any function that waits any significant time
4174        # This also deadlocks if the parent thread joins(), since holding the lock
4175        # will prevent any child threads passing this point.
4176        # So release the lock for the function call.
4177        lock($DBGR);
4178
4179        # Whether or not the autoloader was running, a scalar to put the
4180        # sub's return value in (if needed), and an array to put the sub's
4181        # return value in (if needed).
4182        if ($sub eq 'threads::new' && $ENV{PERL5DB_THREADED}) {
4183            print "creating new thread\n";
4184        }
4185
4186        # If the last ten characters are '::AUTOLOAD', note we've traced
4187        # into AUTOLOAD for $sub.
4188        if ( length($sub) > 10 && substr( $sub, -10, 10 ) eq '::AUTOLOAD' ) {
4189            no strict 'refs';
4190            $al = " for $$sub" if defined $$sub;
4191        }
4192
4193        # Expand @stack.
4194        $#stack = $stack_depth;
4195
4196        # Save current single-step setting.
4197        $stack[-1] = $single;
4198
4199        # Turn off all flags except single-stepping.
4200        $single &= 1;
4201
4202        # If we've gotten really deeply recursed, turn on the flag that will
4203        # make us stop with the 'deep recursion' message.
4204        $single |= 4 if $stack_depth == $deep;
4205
4206        # If frame messages are on ...
4207
4208        _print_frame_message($al);
4209    }
4210
4211    # Determine the sub's return type, and capture appropriately.
4212    if (wantarray) {
4213
4214        # Called in array context. call sub and capture output.
4215        # DB::DB will recursively get control again if appropriate; we'll come
4216        # back here when the sub is finished.
4217        no strict 'refs';
4218        @ret = &$sub;
4219    }
4220    elsif ( defined wantarray ) {
4221        no strict 'refs';
4222        # Save the value if it's wanted at all.
4223        $ret = &$sub;
4224    }
4225    else {
4226        no strict 'refs';
4227        # Void return, explicitly.
4228        &$sub;
4229        undef $ret;
4230    }
4231
4232    {
4233        lock($DBGR);
4234
4235        # Pop the single-step value back off the stack.
4236        $single |= $stack[ $stack_depth-- ];
4237
4238        if ($frame & 2) {
4239            if ($frame & 4) {   # Extended exit message
4240                _indent_print_line_info(0, "out ");
4241                print_trace( $LINEINFO, -1, 1, 1, "$sub$al" );
4242            }
4243            else {
4244                _indent_print_line_info(0, "exited $sub$al\n" );
4245            }
4246        }
4247
4248        if (wantarray) {
4249            # Print the return info if we need to.
4250            if ( $doret eq $stack_depth or $frame & 16 ) {
4251
4252                # Turn off output record separator.
4253                local $\ = '';
4254                my $fh = ( $doret eq $stack_depth ? $OUT : $LINEINFO );
4255
4256                # Indent if we're printing because of $frame tracing.
4257                if ($frame & 16)
4258                  {
4259                      print {$fh} ' ' x $stack_depth;
4260                  }
4261
4262                # Print the return value.
4263                print {$fh} "list context return from $sub:\n";
4264                dumpit( $fh, \@ret );
4265
4266                # And don't print it again.
4267                $doret = -2;
4268            } ## end if ($doret eq $stack_depth...
4269            # And we have to return the return value now.
4270            @ret;
4271        } ## end if (wantarray)
4272        # Scalar context.
4273        else {
4274            # If we are supposed to show the return value... same as before.
4275            if ( $doret eq $stack_depth or $frame & 16 and defined wantarray ) {
4276                local $\ = '';
4277                my $fh = ( $doret eq $stack_depth ? $OUT : $LINEINFO );
4278                print $fh ( ' ' x $stack_depth ) if $frame & 16;
4279                print $fh (
4280                           defined wantarray
4281                           ? "scalar context return from $sub: "
4282                           : "void context return from $sub\n"
4283                          );
4284                dumpit( $fh, $ret ) if defined wantarray;
4285                $doret = -2;
4286            } ## end if ($doret eq $stack_depth...
4287
4288            # Return the appropriate scalar value.
4289            $ret;
4290        } ## end else [ if (wantarray)
4291    }
4292} ## end sub _sub
4293
4294sub lsub : lvalue {
4295
4296    # We stack the stack pointer and then increment it to protect us
4297    # from a situation that might unwind a whole bunch of call frames
4298    # at once. Localizing the stack pointer means that it will automatically
4299    # unwind the same amount when multiple stack frames are unwound.
4300    local $stack_depth = $stack_depth + 1;    # Protect from non-local exits
4301
4302    # Expand @stack.
4303    $#stack = $stack_depth;
4304
4305    # Save current single-step setting.
4306    $stack[-1] = $single;
4307
4308    # Turn off all flags except single-stepping.
4309    # Use local so the single-step value is popped back off the
4310    # stack for us.
4311    local $single = $single & 1;
4312
4313    no strict 'refs';
4314    {
4315        # lock ourselves under threads
4316        lock($DBGR);
4317
4318        # Whether or not the autoloader was running, a scalar to put the
4319        # sub's return value in (if needed), and an array to put the sub's
4320        # return value in (if needed).
4321        my ( $al, $ret, @ret ) = "";
4322        if ($sub =~ /^threads::new$/ && $ENV{PERL5DB_THREADED}) {
4323            print "creating new thread\n";
4324        }
4325
4326        # If the last ten characters are C'::AUTOLOAD', note we've traced
4327        # into AUTOLOAD for $sub.
4328        if ( length($sub) > 10 && substr( $sub, -10, 10 ) eq '::AUTOLOAD' ) {
4329            $al = " for $$sub";
4330        }
4331
4332        # If we've gotten really deeply recursed, turn on the flag that will
4333        # make us stop with the 'deep recursion' message.
4334        $single |= 4 if $stack_depth == $deep;
4335
4336        # If frame messages are on ...
4337        _print_frame_message($al);
4338    }
4339
4340    # call the original lvalue sub.
4341    &$sub;
4342}
4343
4344# Abstracting common code from multiple places elsewhere:
4345sub depth_print_lineinfo {
4346    my $always_print = shift;
4347
4348    print_lineinfo( @_ ) if ($always_print or $stack_depth < $trace_to_depth);
4349}
4350
4351=head1 EXTENDED COMMAND HANDLING AND THE COMMAND API
4352
4353In Perl 5.8.0, there was a major realignment of the commands and what they did,
4354Most of the changes were to systematize the command structure and to eliminate
4355commands that threw away user input without checking.
4356
4357The following sections describe the code added to make it easy to support
4358multiple command sets with conflicting command names. This section is a start
4359at unifying all command processing to make it simpler to develop commands.
4360
4361Note that all the cmd_[a-zA-Z] subroutines require the command name, a line
4362number, and C<$dbline> (the current line) as arguments.
4363
4364Support functions in this section which have multiple modes of failure C<die>
4365on error; the rest simply return a false value.
4366
4367The user-interface functions (all of the C<cmd_*> functions) just output
4368error messages.
4369
4370=head2 C<%set>
4371
4372The C<%set> hash defines the mapping from command letter to subroutine
4373name suffix.
4374
4375C<%set> is a two-level hash, indexed by set name and then by command name.
4376Note that trying to set the CommandSet to C<foobar> simply results in the
43775.8.0 command set being used, since there's no top-level entry for C<foobar>.
4378
4379=cut
4380
4381### The API section
4382
4383my %set = (    #
4384    'pre580' => {
4385        'a' => 'pre580_a',
4386        'A' => 'pre580_null',
4387        'b' => 'pre580_b',
4388        'B' => 'pre580_null',
4389        'd' => 'pre580_null',
4390        'D' => 'pre580_D',
4391        'h' => 'pre580_h',
4392        'M' => 'pre580_null',
4393        'O' => 'o',
4394        'o' => 'pre580_null',
4395        'v' => 'M',
4396        'w' => 'v',
4397        'W' => 'pre580_W',
4398    },
4399    'pre590' => {
4400        '<'  => 'pre590_prepost',
4401        '<<' => 'pre590_prepost',
4402        '>'  => 'pre590_prepost',
4403        '>>' => 'pre590_prepost',
4404        '{'  => 'pre590_prepost',
4405        '{{' => 'pre590_prepost',
4406    },
4407);
4408
4409my %breakpoints_data;
4410
4411sub _has_breakpoint_data_ref {
4412    my ($filename, $line) = @_;
4413
4414    return (
4415        exists( $breakpoints_data{$filename} )
4416            and
4417        exists( $breakpoints_data{$filename}{$line} )
4418    );
4419}
4420
4421sub _get_breakpoint_data_ref {
4422    my ($filename, $line) = @_;
4423
4424    return ($breakpoints_data{$filename}{$line} ||= +{});
4425}
4426
4427sub _delete_breakpoint_data_ref {
4428    my ($filename, $line) = @_;
4429
4430    delete($breakpoints_data{$filename}{$line});
4431    if (! scalar(keys( %{$breakpoints_data{$filename}} )) ) {
4432        delete($breakpoints_data{$filename});
4433    }
4434
4435    return;
4436}
4437
4438sub _set_breakpoint_enabled_status {
4439    my ($filename, $line, $status) = @_;
4440
4441    _get_breakpoint_data_ref($filename, $line)->{'enabled'} =
4442        ($status ? 1 : '')
4443        ;
4444
4445    return;
4446}
4447
4448sub _enable_breakpoint_temp_enabled_status {
4449    my ($filename, $line) = @_;
4450
4451    _get_breakpoint_data_ref($filename, $line)->{'temp_enabled'} = 1;
4452
4453    return;
4454}
4455
4456sub _cancel_breakpoint_temp_enabled_status {
4457    my ($filename, $line) = @_;
4458
4459    my $ref = _get_breakpoint_data_ref($filename, $line);
4460
4461    delete ($ref->{'temp_enabled'});
4462
4463    if (! %$ref) {
4464        _delete_breakpoint_data_ref($filename, $line);
4465    }
4466
4467    return;
4468}
4469
4470sub _is_breakpoint_enabled {
4471    my ($filename, $line) = @_;
4472
4473    my $data_ref = _get_breakpoint_data_ref($filename, $line);
4474    return ($data_ref->{'enabled'} || $data_ref->{'temp_enabled'});
4475}
4476
4477=head2 C<cmd_wrapper()> (API)
4478
4479C<cmd_wrapper()> allows the debugger to switch command sets
4480depending on the value of the C<CommandSet> option.
4481
4482It tries to look up the command in the C<%set> package-level I<lexical>
4483(which means external entities can't fiddle with it) and create the name of
4484the sub to call based on the value found in the hash (if it's there). I<All>
4485of the commands to be handled in a set have to be added to C<%set>; if they
4486aren't found, the 5.8.0 equivalent is called (if there is one).
4487
4488This code uses symbolic references.
4489
4490=cut
4491
4492sub cmd_wrapper {
4493    my $cmd      = shift;
4494    my $line     = shift;
4495    my $dblineno = shift;
4496
4497    # Assemble the command subroutine's name by looking up the
4498    # command set and command name in %set. If we can't find it,
4499    # default to the older version of the command.
4500    my $call = 'cmd_'
4501      . ( $set{$CommandSet}{$cmd}
4502          || ( $cmd =~ /\A[<>{]+/o ? 'prepost' : $cmd ) );
4503
4504    # Call the command subroutine, call it by name.
4505    return __PACKAGE__->can($call)->( $cmd, $line, $dblineno );
4506} ## end sub cmd_wrapper
4507
4508=head3 C<cmd_a> (command)
4509
4510The C<a> command handles pre-execution actions. These are associated with a
4511particular line, so they're stored in C<%dbline>. We default to the current
4512line if none is specified.
4513
4514=cut
4515
4516sub cmd_a {
4517    my $cmd    = shift;
4518    my $line   = shift || '';    # [.|line] expr
4519    my $dbline = shift;
4520
4521    # If it's dot (here), or not all digits,  use the current line.
4522    $line =~ s/\A\./$dbline/;
4523
4524    # Should be a line number followed by an expression.
4525    if ( my ($lineno, $expr) = $line =~ /^\s*(\d*)\s*(\S.+)/ ) {
4526
4527        if (! length($lineno)) {
4528            $lineno = $dbline;
4529        }
4530
4531        # If we have an expression ...
4532        if ( length $expr ) {
4533
4534            # ... but the line isn't breakable, complain.
4535            if ( $dbline[$lineno] == 0 ) {
4536                print $OUT
4537                  "Line $lineno($dbline[$lineno]) does not have an action?\n";
4538            }
4539            else {
4540
4541                # It's executable. Record that the line has an action.
4542                $had_breakpoints{$filename} |= 2;
4543
4544                # Remove any action, temp breakpoint, etc.
4545                $dbline{$lineno} =~ s/\0[^\0]*//;
4546
4547                # Add the action to the line.
4548                $dbline{$lineno} .= "\0" . action($expr);
4549
4550                _set_breakpoint_enabled_status($filename, $lineno, 1);
4551            }
4552        } ## end if (length $expr)
4553    } ## end if ($line =~ /^\s*(\d*)\s*(\S.+)/)
4554    else {
4555
4556        # Syntax wrong.
4557        print $OUT
4558          "Adding an action requires an optional lineno and an expression\n"
4559          ;    # hint
4560    }
4561} ## end sub cmd_a
4562
4563=head3 C<cmd_A> (command)
4564
4565Delete actions. Similar to above, except the delete code is in a separate
4566subroutine, C<delete_action>.
4567
4568=cut
4569
4570sub cmd_A {
4571    my $cmd    = shift;
4572    my $line   = shift || '';
4573    my $dbline = shift;
4574
4575    # Dot is this line.
4576    $line =~ s/^\./$dbline/;
4577
4578    # Call delete_action with a null param to delete them all.
4579    # The '1' forces the eval to be true. It'll be false only
4580    # if delete_action blows up for some reason, in which case
4581    # we print $@ and get out.
4582    if ( $line eq '*' ) {
4583        if (! eval { _delete_all_actions(); 1 }) {
4584            print {$OUT} $@;
4585            return;
4586        }
4587    }
4588
4589    # There's a real line  number. Pass it to delete_action.
4590    # Error trapping is as above.
4591    elsif ( $line =~ /^(\S.*)/ ) {
4592        if (! eval { delete_action($1); 1 }) {
4593            print {$OUT} $@;
4594            return;
4595        }
4596    }
4597
4598    # Swing and a miss. Bad syntax.
4599    else {
4600        print $OUT
4601          "Deleting an action requires a line number, or '*' for all\n" ; # hint
4602    }
4603} ## end sub cmd_A
4604
4605=head3 C<delete_action> (API)
4606
4607C<delete_action> accepts either a line number or C<undef>. If a line number
4608is specified, we check for the line being executable (if it's not, it
4609couldn't have had an  action). If it is, we just take the action off (this
4610will get any kind of an action, including breakpoints).
4611
4612=cut
4613
4614sub _remove_action_from_dbline {
4615    my $i = shift;
4616
4617    $dbline{$i} =~ s/\0[^\0]*//;    # \^a
4618    delete $dbline{$i} if $dbline{$i} eq '';
4619
4620    return;
4621}
4622
4623sub _delete_all_actions {
4624    print {$OUT} "Deleting all actions...\n";
4625
4626    for my $file ( keys %had_breakpoints ) {
4627        local *dbline = $main::{ '_<' . $file };
4628        $max = $#dbline;
4629        my $was;
4630        for my $i (1 .. $max) {
4631            if ( defined $dbline{$i} ) {
4632                _remove_action_from_dbline($i);
4633            }
4634        }
4635
4636        unless ( $had_breakpoints{$file} &= ~2 ) {
4637            delete $had_breakpoints{$file};
4638        }
4639    }
4640
4641    return;
4642}
4643
4644sub delete_action {
4645    my $i = shift;
4646
4647    if ( defined($i) ) {
4648        # Can there be one?
4649        die "Line $i has no action .\n" if $dbline[$i] == 0;
4650
4651        # Nuke whatever's there.
4652        _remove_action_from_dbline($i);
4653    }
4654    else {
4655        _delete_all_actions();
4656    }
4657}
4658
4659=head3 C<cmd_b> (command)
4660
4661Set breakpoints. Since breakpoints can be set in so many places, in so many
4662ways, conditionally or not, the breakpoint code is kind of complex. Mostly,
4663we try to parse the command type, and then shuttle it off to an appropriate
4664subroutine to actually do the work of setting the breakpoint in the right
4665place.
4666
4667=cut
4668
4669sub cmd_b {
4670    my $cmd    = shift;
4671    my $line   = shift;    # [.|line] [cond]
4672    my $dbline = shift;
4673
4674    my $default_cond = sub {
4675        my $cond = shift;
4676        return length($cond) ? $cond : '1';
4677    };
4678
4679    # Make . the current line number if it's there..
4680    $line =~ s/^\.(\s|\z)/$dbline$1/;
4681
4682    # No line number, no condition. Simple break on current line.
4683    if ( $line =~ /^\s*$/ ) {
4684        cmd_b_line( $dbline, 1 );
4685    }
4686
4687    # Break on load for a file.
4688    elsif ( my ($file) = $line =~ /^load\b\s*(.*)/ ) {
4689        $file =~ s/\s+\z//;
4690        cmd_b_load($file);
4691    }
4692
4693    # b compile|postpone <some sub> [<condition>]
4694    # The interpreter actually traps this one for us; we just put the
4695    # necessary condition in the %postponed hash.
4696    elsif ( my ($action, $subname, $cond)
4697        = $line =~ /^(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ ) {
4698
4699        # De-Perl4-ify the name - ' separators to ::.
4700        $subname =~ s/'/::/g;
4701
4702        # Qualify it into the current package unless it's already qualified.
4703        $subname = "${package}::" . $subname unless $subname =~ /::/;
4704
4705        # Add main if it starts with ::.
4706        $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::";
4707
4708        # Save the break type for this sub.
4709        $postponed{$subname} = (($action eq 'postpone')
4710            ? ( "break +0 if " . $default_cond->($cond) )
4711            : "compile");
4712    } ## end elsif ($line =~ ...
4713    # b <filename>:<line> [<condition>]
4714    elsif (my ($filename, $line_num, $cond)
4715        = $line =~ /\A(\S+[^:]):(\d+)\s*(.*)/ms) {
4716        cmd_b_filename_line(
4717            $filename,
4718            $line_num,
4719            (length($cond) ? $cond : '1'),
4720        );
4721    }
4722    # b <sub name> [<condition>]
4723    elsif ( my ($new_subname, $new_cond) =
4724        $line =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ ) {
4725
4726        #
4727        $subname = $new_subname;
4728        cmd_b_sub( $subname, $default_cond->($new_cond) );
4729    }
4730
4731    # b <line> [<condition>].
4732    elsif ( my ($line_n, $cond) = $line =~ /^(\d*)\s*(.*)/ ) {
4733
4734        # Capture the line. If none, it's the current line.
4735        $line = $line_n || $dbline;
4736
4737        # Break on line.
4738        cmd_b_line( $line, $default_cond->($cond) );
4739    }
4740
4741    # Line didn't make sense.
4742    else {
4743        print "confused by line($line)?\n";
4744    }
4745
4746    return;
4747} ## end sub cmd_b
4748
4749=head3 C<break_on_load> (API)
4750
4751We want to break when this file is loaded. Mark this file in the
4752C<%break_on_load> hash, and note that it has a breakpoint in
4753C<%had_breakpoints>.
4754
4755=cut
4756
4757sub break_on_load {
4758    my $file = shift;
4759    $break_on_load{$file} = 1;
4760    $had_breakpoints{$file} |= 1;
4761}
4762
4763=head3 C<report_break_on_load> (API)
4764
4765Gives us an array of filenames that are set to break on load. Note that
4766only files with break-on-load are in here, so simply showing the keys
4767suffices.
4768
4769=cut
4770
4771sub report_break_on_load {
4772    sort keys %break_on_load;
4773}
4774
4775=head3 C<cmd_b_load> (command)
4776
4777We take the file passed in and try to find it in C<%INC> (which maps modules
4778to files they came from). We mark those files for break-on-load via
4779C<break_on_load> and then report that it was done.
4780
4781=cut
4782
4783sub cmd_b_load {
4784    my $file = shift;
4785    my @files;
4786
4787    # This is a block because that way we can use a redo inside it
4788    # even without there being any looping structure at all outside it.
4789    {
4790
4791        # Save short name and full path if found.
4792        push @files, $file;
4793        push @files, $::INC{$file} if $::INC{$file};
4794
4795        # Tack on .pm and do it again unless there was a '.' in the name
4796        # already.
4797        $file .= '.pm', redo unless $file =~ /\./;
4798    }
4799
4800    # Do the real work here.
4801    break_on_load($_) for @files;
4802
4803    # All the files that have break-on-load breakpoints.
4804    @files = report_break_on_load;
4805
4806    # Normalize for the purposes of our printing this.
4807    local $\ = '';
4808    local $" = ' ';
4809    print $OUT "Will stop on load of '@files'.\n";
4810} ## end sub cmd_b_load
4811
4812=head3 C<$filename_error> (API package global)
4813
4814Several of the functions we need to implement in the API need to work both
4815on the current file and on other files. We don't want to duplicate code, so
4816C<$filename_error> is used to contain the name of the file that's being
4817worked on (if it's not the current one).
4818
4819We can now build functions in pairs: the basic function works on the current
4820file, and uses C<$filename_error> as part of its error message. Since this is
4821initialized to C<"">, no filename will appear when we are working on the
4822current file.
4823
4824The second function is a wrapper which does the following:
4825
4826=over 4
4827
4828=item *
4829
4830Localizes C<$filename_error> and sets it to the name of the file to be processed.
4831
4832=item *
4833
4834Localizes the C<*dbline> glob and reassigns it to point to the file we want to process.
4835
4836=item *
4837
4838Calls the first function.
4839
4840The first function works on the I<current> file (i.e., the one we changed to),
4841and prints C<$filename_error> in the error message (the name of the other file)
4842if it needs to. When the functions return, C<*dbline> is restored to point
4843to the actual current file (the one we're executing in) and
4844C<$filename_error> is restored to C<"">. This restores everything to
4845the way it was before the second function was called at all.
4846
4847See the comments in C<breakable_line> and C<breakable_line_in_file> for more
4848details.
4849
4850=back
4851
4852=cut
4853
4854use vars qw($filename_error);
4855$filename_error = '';
4856
4857=head3 breakable_line(from, to) (API)
4858
4859The subroutine decides whether or not a line in the current file is breakable.
4860It walks through C<@dbline> within the range of lines specified, looking for
4861the first line that is breakable.
4862
4863If C<$to> is greater than C<$from>, the search moves forwards, finding the
4864first line I<after> C<$to> that's breakable, if there is one.
4865
4866If C<$from> is greater than C<$to>, the search goes I<backwards>, finding the
4867first line I<before> C<$to> that's breakable, if there is one.
4868
4869=cut
4870
4871sub breakable_line {
4872
4873    my ( $from, $to ) = @_;
4874
4875    # $i is the start point. (Where are the FORTRAN programs of yesteryear?)
4876    my $i = $from;
4877
4878    # If there are at least 2 arguments, we're trying to search a range.
4879    if ( @_ >= 2 ) {
4880
4881        # $delta is positive for a forward search, negative for a backward one.
4882        my $delta = $from < $to ? +1 : -1;
4883
4884        # Keep us from running off the ends of the file.
4885        my $limit = $delta > 0 ? $#dbline : 1;
4886
4887        # Clever test. If you're a mathematician, it's obvious why this
4888        # test works. If not:
4889        # If $delta is positive (going forward), $limit will be $#dbline.
4890        #    If $to is less than $limit, ($limit - $to) will be positive, times
4891        #    $delta of 1 (positive), so the result is > 0 and we should use $to
4892        #    as the stopping point.
4893        #
4894        #    If $to is greater than $limit, ($limit - $to) is negative,
4895        #    times $delta of 1 (positive), so the result is < 0 and we should
4896        #    use $limit ($#dbline) as the stopping point.
4897        #
4898        # If $delta is negative (going backward), $limit will be 1.
4899        #    If $to is zero, ($limit - $to) will be 1, times $delta of -1
4900        #    (negative) so the result is > 0, and we use $to as the stopping
4901        #    point.
4902        #
4903        #    If $to is less than zero, ($limit - $to) will be positive,
4904        #    times $delta of -1 (negative), so the result is not > 0, and
4905        #    we use $limit (1) as the stopping point.
4906        #
4907        #    If $to is 1, ($limit - $to) will zero, times $delta of -1
4908        #    (negative), still giving zero; the result is not > 0, and
4909        #    we use $limit (1) as the stopping point.
4910        #
4911        #    if $to is >1, ($limit - $to) will be negative, times $delta of -1
4912        #    (negative), giving a positive (>0) value, so we'll set $limit to
4913        #    $to.
4914
4915        $limit = $to if ( $limit - $to ) * $delta > 0;
4916
4917        # The real search loop.
4918        # $i starts at $from (the point we want to start searching from).
4919        # We move through @dbline in the appropriate direction (determined
4920        # by $delta: either -1 (back) or +1 (ahead).
4921        # We stay in as long as we haven't hit an executable line
4922        # ($dbline[$i] == 0 means not executable) and we haven't reached
4923        # the limit yet (test similar to the above).
4924        $i += $delta while $dbline[$i] == 0 and ( $limit - $i ) * $delta > 0;
4925
4926    } ## end if (@_ >= 2)
4927
4928    # If $i points to a line that is executable, return that.
4929    return $i unless $dbline[$i] == 0;
4930
4931    # Format the message and print it: no breakable lines in range.
4932    my ( $pl, $upto ) = ( '', '' );
4933    ( $pl, $upto ) = ( 's', "..$to" ) if @_ >= 2 and $from != $to;
4934
4935    # If there's a filename in filename_error, we'll see it.
4936    # If not, not.
4937    die "Line$pl $from$upto$filename_error not breakable\n";
4938} ## end sub breakable_line
4939
4940=head3 breakable_line_in_filename(file, from, to) (API)
4941
4942Like C<breakable_line>, but look in another file.
4943
4944=cut
4945
4946sub breakable_line_in_filename {
4947
4948    # Capture the file name.
4949    my ($f) = shift;
4950
4951    # Swap the magic line array over there temporarily.
4952    local *dbline = $main::{ '_<' . $f };
4953
4954    # If there's an error, it's in this other file.
4955    local $filename_error = " of '$f'";
4956
4957    # Find the breakable line.
4958    breakable_line(@_);
4959
4960    # *dbline and $filename_error get restored when this block ends.
4961
4962} ## end sub breakable_line_in_filename
4963
4964=head3 break_on_line(lineno, [condition]) (API)
4965
4966Adds a breakpoint with the specified condition (or 1 if no condition was
4967specified) to the specified line. Dies if it can't.
4968
4969=cut
4970
4971sub break_on_line {
4972    my $i = shift;
4973    my $cond = @_ ? shift(@_) : 1;
4974
4975    my $inii  = $i;
4976    my $after = '';
4977    my $pl    = '';
4978
4979    # Woops, not a breakable line. $filename_error allows us to say
4980    # if it was in a different file.
4981    die "Line $i$filename_error not breakable.\n" if $dbline[$i] == 0;
4982
4983    # Mark this file as having breakpoints in it.
4984    $had_breakpoints{$filename} |= 1;
4985
4986    # If there is an action or condition here already ...
4987    if ( $dbline{$i} ) {
4988
4989        # ... swap this condition for the existing one.
4990        $dbline{$i} =~ s/^[^\0]*/$cond/;
4991    }
4992    else {
4993
4994        # Nothing here - just add the condition.
4995        $dbline{$i} = $cond;
4996
4997        _set_breakpoint_enabled_status($filename, $i, 1);
4998    }
4999
5000    return;
5001} ## end sub break_on_line
5002
5003=head3 cmd_b_line(line, [condition]) (command)
5004
5005Wrapper for C<break_on_line>. Prints the failure message if it
5006doesn't work.
5007
5008=cut
5009
5010sub cmd_b_line {
5011    if (not eval { break_on_line(@_); 1 }) {
5012        local $\ = '';
5013        print $OUT $@ and return;
5014    }
5015
5016    return;
5017} ## end sub cmd_b_line
5018
5019=head3 cmd_b_filename_line(line, [condition]) (command)
5020
5021Wrapper for C<break_on_filename_line>. Prints the failure message if it
5022doesn't work.
5023
5024=cut
5025
5026sub cmd_b_filename_line {
5027    if (not eval { break_on_filename_line(@_); 1 }) {
5028        local $\ = '';
5029        print $OUT $@ and return;
5030    }
5031
5032    return;
5033}
5034
5035=head3 break_on_filename_line(file, line, [condition]) (API)
5036
5037Switches to the file specified and then calls C<break_on_line> to set
5038the breakpoint.
5039
5040=cut
5041
5042sub break_on_filename_line {
5043    my $f = shift;
5044    my $i = shift;
5045    my $cond = @_ ? shift(@_) : 1;
5046
5047    # Switch the magical hash temporarily.
5048    local *dbline = $main::{ '_<' . $f };
5049
5050    # Localize the variables that break_on_line uses to make its message.
5051    local $filename_error = " of '$f'";
5052    local $filename       = $f;
5053
5054    # Add the breakpoint.
5055    break_on_line( $i, $cond );
5056
5057    return;
5058} ## end sub break_on_filename_line
5059
5060=head3 break_on_filename_line_range(file, from, to, [condition]) (API)
5061
5062Switch to another file, search the range of lines specified for an
5063executable one, and put a breakpoint on the first one you find.
5064
5065=cut
5066
5067sub break_on_filename_line_range {
5068    my $f = shift;
5069    my $from = shift;
5070    my $to = shift;
5071    my $cond = @_ ? shift(@_) : 1;
5072
5073    # Find a breakable line if there is one.
5074    my $i = breakable_line_in_filename( $f, $from, $to );
5075
5076    # Add the breakpoint.
5077    break_on_filename_line( $f, $i, $cond );
5078
5079    return;
5080} ## end sub break_on_filename_line_range
5081
5082=head3 subroutine_filename_lines(subname, [condition]) (API)
5083
5084Search for a subroutine within a given file. The condition is ignored.
5085Uses C<find_sub> to locate the desired subroutine.
5086
5087=cut
5088
5089sub subroutine_filename_lines {
5090    my ( $subname ) = @_;
5091
5092    # Returned value from find_sub() is fullpathname:startline-endline.
5093    # The match creates the list (fullpathname, start, end).
5094    return (find_sub($subname) =~ /^(.*):(\d+)-(\d+)$/);
5095} ## end sub subroutine_filename_lines
5096
5097=head3 break_subroutine(subname) (API)
5098
5099Places a break on the first line possible in the specified subroutine. Uses
5100C<subroutine_filename_lines> to find the subroutine, and
5101C<break_on_filename_line_range> to place the break.
5102
5103=cut
5104
5105sub break_subroutine {
5106    my $subname = shift;
5107
5108    # Get filename, start, and end.
5109    my ( $file, $s, $e ) = subroutine_filename_lines($subname)
5110      or die "Subroutine $subname not found.\n";
5111
5112
5113    # Null condition changes to '1' (always true).
5114    my $cond = @_ ? shift(@_) : 1;
5115
5116    # Put a break the first place possible in the range of lines
5117    # that make up this subroutine.
5118    break_on_filename_line_range( $file, $s, $e, $cond );
5119
5120    return;
5121} ## end sub break_subroutine
5122
5123=head3 cmd_b_sub(subname, [condition]) (command)
5124
5125We take the incoming subroutine name and fully-qualify it as best we can.
5126
5127=over 4
5128
5129=item 1. If it's already fully-qualified, leave it alone.
5130
5131=item 2. Try putting it in the current package.
5132
5133=item 3. If it's not there, try putting it in CORE::GLOBAL if it exists there.
5134
5135=item 4. If it starts with '::', put it in 'main::'.
5136
5137=back
5138
5139After all this cleanup, we call C<break_subroutine> to try to set the
5140breakpoint.
5141
5142=cut
5143
5144sub cmd_b_sub {
5145    my $subname = shift;
5146    my $cond = @_ ? shift : 1;
5147
5148    # If the subname isn't a code reference, qualify it so that
5149    # break_subroutine() will work right.
5150    if ( ref($subname) ne 'CODE' ) {
5151
5152        # Not Perl 4.
5153        $subname =~ s/'/::/g;
5154        my $s = $subname;
5155
5156        # Put it in this package unless it's already qualified.
5157        if ($subname !~ /::/)
5158        {
5159            $subname = $package . '::' . $subname;
5160        };
5161
5162        # Requalify it into CORE::GLOBAL if qualifying it into this
5163        # package resulted in its not being defined, but only do so
5164        # if it really is in CORE::GLOBAL.
5165        my $core_name = "CORE::GLOBAL::$s";
5166        if ((!defined(&$subname))
5167                and ($s !~ /::/)
5168                and (defined &{$core_name}))
5169        {
5170            $subname = $core_name;
5171        }
5172
5173        # Put it in package 'main' if it has a leading ::.
5174        if ($subname =~ /\A::/)
5175        {
5176            $subname = "main" . $subname;
5177        }
5178    } ## end if ( ref($subname) ne 'CODE' ) {
5179
5180    # Try to set the breakpoint.
5181    if (not eval { break_subroutine( $subname, $cond ); 1 }) {
5182        local $\ = '';
5183        print {$OUT} $@;
5184        return;
5185    }
5186
5187    return;
5188} ## end sub cmd_b_sub
5189
5190=head3 C<cmd_B> - delete breakpoint(s) (command)
5191
5192The command mostly parses the command line and tries to turn the argument
5193into a line spec. If it can't, it uses the current line. It then calls
5194C<delete_breakpoint> to actually do the work.
5195
5196If C<*> is  specified, C<cmd_B> calls C<delete_breakpoint> with no arguments,
5197thereby deleting all the breakpoints.
5198
5199=cut
5200
5201sub cmd_B {
5202    my $cmd = shift;
5203
5204    # No line spec? Use dbline.
5205    # If there is one, use it if it's non-zero, or wipe it out if it is.
5206    my $line   = ( $_[0] =~ /\A\./ ) ? $dbline : (shift || '');
5207    my $dbline = shift;
5208
5209    # If the line was dot, make the line the current one.
5210    $line =~ s/^\./$dbline/;
5211
5212    # If it's * we're deleting all the breakpoints.
5213    if ( $line eq '*' ) {
5214        if (not eval { delete_breakpoint(); 1 }) {
5215            print {$OUT} $@;
5216        }
5217    }
5218
5219    # If there is a line spec, delete the breakpoint on that line.
5220    elsif ( $line =~ /\A(\S.*)/ ) {
5221        if (not eval { delete_breakpoint( $line || $dbline ); 1 }) {
5222            local $\ = '';
5223            print {$OUT} $@;
5224        }
5225    } ## end elsif ($line =~ /^(\S.*)/)
5226
5227    # No line spec.
5228    else {
5229        print {$OUT}
5230          "Deleting a breakpoint requires a line number, or '*' for all\n"
5231          ;    # hint
5232    }
5233
5234    return;
5235} ## end sub cmd_B
5236
5237=head3 delete_breakpoint([line]) (API)
5238
5239This actually does the work of deleting either a single breakpoint, or all
5240of them.
5241
5242For a single line, we look for it in C<@dbline>. If it's nonbreakable, we
5243just drop out with a message saying so. If it is, we remove the condition
5244part of the 'condition\0action' that says there's a breakpoint here. If,
5245after we've done that, there's nothing left, we delete the corresponding
5246line in C<%dbline> to signal that no action needs to be taken for this line.
5247
5248For all breakpoints, we iterate through the keys of C<%had_breakpoints>,
5249which lists all currently-loaded files which have breakpoints. We then look
5250at each line in each of these files, temporarily switching the C<%dbline>
5251and C<@dbline> structures to point to the files in question, and do what
5252we did in the single line case: delete the condition in C<@dbline>, and
5253delete the key in C<%dbline> if nothing's left.
5254
5255We then wholesale delete C<%postponed>, C<%postponed_file>, and
5256C<%break_on_load>, because these structures contain breakpoints for files
5257and code that haven't been loaded yet. We can just kill these off because there
5258are no magical debugger structures associated with them.
5259
5260=cut
5261
5262sub _remove_breakpoint_entry {
5263    my ($fn, $i) = @_;
5264
5265    delete $dbline{$i};
5266    _delete_breakpoint_data_ref($fn, $i);
5267
5268    return;
5269}
5270
5271sub _delete_all_breakpoints {
5272    print {$OUT} "Deleting all breakpoints...\n";
5273
5274    # %had_breakpoints lists every file that had at least one
5275    # breakpoint in it.
5276    for my $fn ( keys %had_breakpoints ) {
5277
5278        # Switch to the desired file temporarily.
5279        local *dbline = $main::{ '_<' . $fn };
5280
5281        $max = $#dbline;
5282
5283        # For all lines in this file ...
5284        for my $i (1 .. $max) {
5285
5286            # If there's a breakpoint or action on this line ...
5287            if ( defined $dbline{$i} ) {
5288
5289                # ... remove the breakpoint.
5290                $dbline{$i} =~ s/\A[^\0]+//;
5291                if ( $dbline{$i} =~ s/\A\0?\z// ) {
5292                    # Remove the entry altogether if no action is there.
5293                    _remove_breakpoint_entry($fn, $i);
5294                }
5295            } ## end if (defined $dbline{$i...
5296        } ## end for $i (1 .. $max)
5297
5298        # If, after we turn off the "there were breakpoints in this file"
5299        # bit, the entry in %had_breakpoints for this file is zero,
5300        # we should remove this file from the hash.
5301        if ( not $had_breakpoints{$fn} &= (~1) ) {
5302            delete $had_breakpoints{$fn};
5303        }
5304    } ## end for my $fn (keys %had_breakpoints)
5305
5306    # Kill off all the other breakpoints that are waiting for files that
5307    # haven't been loaded yet.
5308    undef %postponed;
5309    undef %postponed_file;
5310    undef %break_on_load;
5311
5312    return;
5313}
5314
5315sub _delete_breakpoint_from_line {
5316    my ($i) = @_;
5317
5318    # Woops. This line wasn't breakable at all.
5319    die "Line $i not breakable.\n" if $dbline[$i] == 0;
5320
5321    # Kill the condition, but leave any action.
5322    $dbline{$i} =~ s/\A[^\0]*//;
5323
5324    # Remove the entry entirely if there's no action left.
5325    if ($dbline{$i} eq '') {
5326        _remove_breakpoint_entry($filename, $i);
5327    }
5328
5329    return;
5330}
5331
5332sub delete_breakpoint {
5333    my $i = shift;
5334
5335    # If we got a line, delete just that one.
5336    if ( defined($i) ) {
5337        _delete_breakpoint_from_line($i);
5338    }
5339    # No line; delete them all.
5340    else {
5341        _delete_all_breakpoints();
5342    }
5343
5344    return;
5345}
5346
5347=head3 cmd_stop (command)
5348
5349This is meant to be part of the new command API, but it isn't called or used
5350anywhere else in the debugger. XXX It is probably meant for use in development
5351of new commands.
5352
5353=cut
5354
5355sub cmd_stop {    # As on ^C, but not signal-safy.
5356    $signal = 1;
5357}
5358
5359=head3 C<cmd_e> - threads
5360
5361Display the current thread id:
5362
5363    e
5364
5365This could be how (when implemented) to send commands to this thread id (e cmd)
5366or that thread id (e tid cmd).
5367
5368=cut
5369
5370sub cmd_e {
5371    my $cmd  = shift;
5372    my $line = shift;
5373    unless (exists($INC{'threads.pm'})) {
5374        print "threads not loaded($ENV{PERL5DB_THREADED})
5375        please run the debugger with PERL5DB_THREADED=1 set in the environment\n";
5376    } else {
5377        my $tid = threads->tid;
5378        print "thread id: $tid\n";
5379    }
5380} ## end sub cmd_e
5381
5382=head3 C<cmd_E> - list of thread ids
5383
5384Display the list of available thread ids:
5385
5386    E
5387
5388This could be used (when implemented) to send commands to all threads (E cmd).
5389
5390=cut
5391
5392sub cmd_E {
5393    my $cmd  = shift;
5394    my $line = shift;
5395    unless (exists($INC{'threads.pm'})) {
5396        print "threads not loaded($ENV{PERL5DB_THREADED})
5397        please run the debugger with PERL5DB_THREADED=1 set in the environment\n";
5398    } else {
5399        my $tid = threads->tid;
5400        print "thread ids: ".join(', ',
5401            map { ($tid == $_->tid ? '<'.$_->tid.'>' : $_->tid) } threads->list
5402        )."\n";
5403    }
5404} ## end sub cmd_E
5405
5406=head3 C<cmd_h> - help command (command)
5407
5408Does the work of either
5409
5410=over 4
5411
5412=item *
5413
5414Showing all the debugger help
5415
5416=item *
5417
5418Showing help for a specific command
5419
5420=back
5421
5422=cut
5423
5424use vars qw($help);
5425use vars qw($summary);
5426
5427sub cmd_h {
5428    my $cmd = shift;
5429
5430    # If we have no operand, assume null.
5431    my $line = shift || '';
5432
5433    # 'h h'. Print the long-format help.
5434    if ( $line =~ /\Ah\s*\z/ ) {
5435        print_help($help);
5436    }
5437
5438    # 'h <something>'. Search for the command and print only its help.
5439    elsif ( my ($asked) = $line =~ /\A(\S.*)\z/ ) {
5440
5441        # support long commands; otherwise bogus errors
5442        # happen when you ask for h on <CR> for example
5443        my $qasked = quotemeta($asked);    # for searching; we don't
5444                                           # want to use it as a pattern.
5445                                           # XXX: finds CR but not <CR>
5446
5447        # Search the help string for the command.
5448        if (
5449            $help =~ /^                    # Start of a line
5450                      <?                   # Optional '<'
5451                      (?:[IB]<)            # Optional markup
5452                      $qasked              # The requested command
5453                     /mx
5454          )
5455        {
5456
5457            # It's there; pull it out and print it.
5458            while (
5459                $help =~ /^
5460                              (<?            # Optional '<'
5461                                 (?:[IB]<)   # Optional markup
5462                                 $qasked     # The command
5463                                 ([\s\S]*?)  # Description line(s)
5464                              \n)            # End of last description line
5465                              (?!\s)         # Next line not starting with
5466                                             # whitespace
5467                             /mgx
5468              )
5469            {
5470                print_help($1);
5471            }
5472        }
5473
5474        # Not found; not a debugger command.
5475        else {
5476            print_help("B<$asked> is not a debugger command.\n");
5477        }
5478    } ## end elsif ($line =~ /^(\S.*)$/)
5479
5480    # 'h' - print the summary help.
5481    else {
5482        print_help($summary);
5483    }
5484} ## end sub cmd_h
5485
5486=head3 C<cmd_i> - inheritance display
5487
5488Display the (nested) parentage of the module or object given.
5489
5490=cut
5491
5492sub cmd_i {
5493    my $cmd  = shift;
5494    my $line = shift;
5495
5496    require mro;
5497
5498    foreach my $isa ( split( /\s+/, $line ) ) {
5499        $evalarg = $isa;
5500        # The &-call is here to ascertain the mutability of @_.
5501        ($isa) = &DB::eval;
5502        no strict 'refs';
5503        print join(
5504            ', ',
5505            map {
5506                "$_"
5507                  . (
5508                    defined( ${"$_\::VERSION"} )
5509                    ? ' ' . ${"$_\::VERSION"}
5510                    : undef )
5511              } @{mro::get_linear_isa(ref($isa) || $isa)}
5512        );
5513        print "\n";
5514    }
5515} ## end sub cmd_i
5516
5517=head3 C<cmd_l> - list lines (command)
5518
5519Most of the command is taken up with transforming all the different line
5520specification syntaxes into 'start-stop'. After that is done, the command
5521runs a loop over C<@dbline> for the specified range of lines. It handles
5522the printing of each line and any markers (C<==E<gt>> for current line,
5523C<b> for break on this line, C<a> for action on this line, C<:> for this
5524line breakable).
5525
5526We save the last line listed in the C<$start> global for further listing
5527later.
5528
5529=cut
5530
5531sub _min {
5532    my $min = shift;
5533    foreach my $v (@_) {
5534        if ($min > $v) {
5535            $min = $v;
5536        }
5537    }
5538    return $min;
5539}
5540
5541sub _max {
5542    my $max = shift;
5543    foreach my $v (@_) {
5544        if ($max < $v) {
5545            $max = $v;
5546        }
5547    }
5548    return $max;
5549}
5550
5551sub _minify_to_max {
5552    my $ref = shift;
5553
5554    $$ref = _min($$ref, $max);
5555
5556    return;
5557}
5558
5559sub _cmd_l_handle_var_name {
5560    my $var_name = shift;
5561
5562    $evalarg = $var_name;
5563
5564    my ($s) = DB::eval();
5565
5566    # Ooops. Bad scalar.
5567    if ($@) {
5568        print {$OUT} "Error: $@\n";
5569        next CMD;
5570    }
5571
5572    # Good scalar. If it's a reference, find what it points to.
5573    $s = CvGV_name($s);
5574    print {$OUT} "Interpreted as: $1 $s\n";
5575    $line = "$1 $s";
5576
5577    # Call self recursively to really do the command.
5578    return _cmd_l_main( $s );
5579}
5580
5581sub _cmd_l_handle_subname {
5582
5583    my $s = $subname;
5584
5585    # De-Perl4.
5586    $subname =~ s/\'/::/;
5587
5588    # Put it in this package unless it starts with ::.
5589    $subname = $package . "::" . $subname unless $subname =~ /::/;
5590
5591    # Put it in CORE::GLOBAL if t doesn't start with :: and
5592    # it doesn't live in this package and it lives in CORE::GLOBAL.
5593    $subname = "CORE::GLOBAL::$s"
5594    if not defined &$subname
5595        and $s !~ /::/
5596        and defined &{"CORE::GLOBAL::$s"};
5597
5598    # Put leading '::' names into 'main::'.
5599    $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::";
5600
5601    # Get name:start-stop from find_sub, and break this up at
5602    # colons.
5603    my @pieces = split( /:/, find_sub($subname) || $sub{$subname} );
5604
5605    # Pull off start-stop.
5606    my $subrange = pop @pieces;
5607
5608    # If the name contained colons, the split broke it up.
5609    # Put it back together.
5610    $file = join( ':', @pieces );
5611
5612    # If we're not in that file, switch over to it.
5613    if ( $file ne $filename ) {
5614        if (! $slave_editor) {
5615            print {$OUT} "Switching to file '$file'.\n";
5616        }
5617
5618        # Switch debugger's magic structures.
5619        *dbline   = $main::{ '_<' . $file };
5620        $max      = $#dbline;
5621        $filename = $file;
5622    } ## end if ($file ne $filename)
5623
5624    # Subrange is 'start-stop'. If this is less than a window full,
5625    # swap it to 'start+', which will list a window from the start point.
5626    if ($subrange) {
5627        if ( eval($subrange) < -$window ) {
5628            $subrange =~ s/-.*/+/;
5629        }
5630
5631        # Call self recursively to list the range.
5632        return _cmd_l_main( $subrange );
5633    } ## end if ($subrange)
5634
5635    # Couldn't find it.
5636    else {
5637        print {$OUT} "Subroutine $subname not found.\n";
5638        return;
5639    }
5640}
5641
5642sub _cmd_l_empty {
5643    # Compute new range to list.
5644    $incr = $window - 1;
5645
5646    # Recurse to do it.
5647    return _cmd_l_main( $start . '-' . ( $start + $incr ) );
5648}
5649
5650sub _cmd_l_plus {
5651    my ($new_start, $new_incr) = @_;
5652
5653    # Don't reset start for 'l +nnn'.
5654    $start = $new_start if $new_start;
5655
5656    # Increment for list. Use window size if not specified.
5657    # (Allows 'l +' to work.)
5658    $incr = $new_incr || ($window - 1);
5659
5660    # Create a line range we'll understand, and recurse to do it.
5661    return _cmd_l_main( $start . '-' . ( $start + $incr ) );
5662}
5663
5664sub _cmd_l_calc_initial_end_and_i {
5665    my ($spec, $start_match, $end_match) = @_;
5666
5667    # Determine end point; use end of file if not specified.
5668    my $end = ( !defined $start_match ) ? $max :
5669    ( $end_match ? $end_match : $start_match );
5670
5671    # Go on to the end, and then stop.
5672    _minify_to_max(\$end);
5673
5674    # Determine start line.
5675    my $i = $start_match;
5676
5677    if ($i eq '.') {
5678        $i = $spec;
5679    }
5680
5681    $i = _max($i, 1);
5682
5683    $incr = $end - $i;
5684
5685    return ($end, $i);
5686}
5687
5688sub _cmd_l_range {
5689    my ($spec, $current_line, $start_match, $end_match) = @_;
5690
5691    my ($end, $i) =
5692        _cmd_l_calc_initial_end_and_i($spec, $start_match, $end_match);
5693
5694    # If we're running under a slave editor, force it to show the lines.
5695    if ($slave_editor) {
5696        print {$OUT} "\032\032$filename:$i:0\n";
5697        $i = $end;
5698    }
5699    # We're doing it ourselves. We want to show the line and special
5700    # markers for:
5701    # - the current line in execution
5702    # - whether a line is breakable or not
5703    # - whether a line has a break or not
5704    # - whether a line has an action or not
5705    else {
5706        I_TO_END:
5707        for ( ; $i <= $end ; $i++ ) {
5708
5709            # Check for breakpoints and actions.
5710            my ( $stop, $action );
5711            if ($dbline{$i}) {
5712                ( $stop, $action ) = split( /\0/, $dbline{$i} );
5713            }
5714
5715            # ==> if this is the current line in execution,
5716            # : if it's breakable.
5717            my $arrow =
5718            ( $i == $current_line and $filename eq $filename_ini )
5719            ? '==>'
5720            : ( $dbline[$i] + 0 ? ':' : ' ' );
5721
5722            # Add break and action indicators.
5723            $arrow .= 'b' if $stop;
5724            $arrow .= 'a' if $action;
5725
5726            # Print the line.
5727            print {$OUT} "$i$arrow\t", $dbline[$i];
5728
5729            # Move on to the next line. Drop out on an interrupt.
5730            if ($signal) {
5731                $i++;
5732                last I_TO_END;
5733            }
5734        } ## end for (; $i <= $end ; $i++)
5735
5736        # Line the prompt up; print a newline if the last line listed
5737        # didn't have a newline.
5738        if ($dbline[ $i - 1 ] !~ /\n\z/) {
5739            print {$OUT} "\n";
5740        }
5741    } ## end else [ if ($slave_editor)
5742
5743    # Save the point we last listed to in case another relative 'l'
5744    # command is desired. Don't let it run off the end.
5745    $start = $i;
5746    _minify_to_max(\$start);
5747
5748    return;
5749}
5750
5751sub _cmd_l_main {
5752    my $spec = shift;
5753
5754    # If this is '-something', delete any spaces after the dash.
5755    $spec =~ s/\A-\s*\z/-/;
5756
5757    # If the line is '$something', assume this is a scalar containing a
5758    # line number.
5759    # Set up for DB::eval() - evaluate in *user* context.
5760    if ( my ($var_name) = $spec =~ /\A(\$.*)/s ) {
5761        return _cmd_l_handle_var_name($var_name);
5762    }
5763    # l name. Try to find a sub by that name.
5764    elsif ( ($subname) = $spec =~ /\A([\':A-Za-z_][\':\w]*(?:\[.*\])?)/s ) {
5765        return _cmd_l_handle_subname();
5766    }
5767    # Bare 'l' command.
5768    elsif ( $spec !~ /\S/ ) {
5769        return _cmd_l_empty();
5770    }
5771    # l [start]+number_of_lines
5772    elsif ( my ($new_start, $new_incr) = $spec =~ /\A(\d*)\+(\d*)\z/ ) {
5773        return _cmd_l_plus($new_start, $new_incr);
5774    }
5775    # l start-stop or l start,stop
5776    elsif (my ($s, $e) = $spec =~ /^(?:(-?[\d\$\.]+)(?:[-,]([\d\$\.]+))?)?/ ) {
5777        return _cmd_l_range($spec, $line, $s, $e);
5778    }
5779
5780    return;
5781} ## end sub cmd_l
5782
5783sub cmd_l {
5784    my (undef, $line) = @_;
5785
5786    return _cmd_l_main($line);
5787}
5788
5789=head3 C<cmd_L> - list breakpoints, actions, and watch expressions (command)
5790
5791To list breakpoints, the command has to look determine where all of them are
5792first. It starts a C<%had_breakpoints>, which tells us what all files have
5793breakpoints and/or actions. For each file, we switch the C<*dbline> glob (the
5794magic source and breakpoint data structures) to the file, and then look
5795through C<%dbline> for lines with breakpoints and/or actions, listing them
5796out. We look through C<%postponed> not-yet-compiled subroutines that have
5797breakpoints, and through C<%postponed_file> for not-yet-C<require>'d files
5798that have breakpoints.
5799
5800Watchpoints are simpler: we just list the entries in C<@to_watch>.
5801
5802=cut
5803
5804sub _cmd_L_calc_arg {
5805    # If no argument, list everything. Pre-5.8.0 version always lists
5806    # everything
5807    my $arg = shift || 'abw';
5808    if ($CommandSet ne '580')
5809    {
5810        $arg = 'abw';
5811    }
5812
5813    return $arg;
5814}
5815
5816sub _cmd_L_calc_wanted_flags {
5817    my $arg = _cmd_L_calc_arg(shift);
5818
5819    return (map { index($arg, $_) >= 0 ? 1 : 0 } qw(a b w));
5820}
5821
5822
5823sub _cmd_L_handle_breakpoints {
5824    my ($handle_db_line) = @_;
5825
5826    BREAKPOINTS_SCAN:
5827    # Look in all the files with breakpoints...
5828    for my $file ( keys %had_breakpoints ) {
5829
5830        # Temporary switch to this file.
5831        local *dbline = $main::{ '_<' . $file };
5832
5833        # Set up to look through the whole file.
5834        $max = $#dbline;
5835        my $was;    # Flag: did we print something
5836        # in this file?
5837
5838        # For each line in the file ...
5839        for my $i (1 .. $max) {
5840
5841            # We've got something on this line.
5842            if ( defined $dbline{$i} ) {
5843
5844                # Print the header if we haven't.
5845                if (not $was++) {
5846                    print {$OUT} "$file:\n";
5847                }
5848
5849                # Print the line.
5850                print {$OUT} " $i:\t", $dbline[$i];
5851
5852                $handle_db_line->($dbline{$i});
5853
5854                # Quit if the user hit interrupt.
5855                if ($signal) {
5856                    last BREAKPOINTS_SCAN;
5857                }
5858            } ## end if (defined $dbline{$i...
5859        } ## end for my $i (1 .. $max)
5860    } ## end for my $file (keys %had_breakpoints)
5861
5862    return;
5863}
5864
5865sub _cmd_L_handle_postponed_breakpoints {
5866    my ($handle_db_line) = @_;
5867
5868    print {$OUT} "Postponed breakpoints in files:\n";
5869
5870    POSTPONED_SCANS:
5871    for my $file ( keys %postponed_file ) {
5872        my $db = $postponed_file{$file};
5873        print {$OUT} " $file:\n";
5874        for my $line ( sort { $a <=> $b } keys %$db ) {
5875            print {$OUT} "  $line:\n";
5876
5877            $handle_db_line->($db->{$line});
5878
5879            if ($signal) {
5880                last POSTPONED_SCANS;
5881            }
5882        }
5883        if ($signal) {
5884            last POSTPONED_SCANS;
5885        }
5886    }
5887
5888    return;
5889}
5890
5891
5892sub cmd_L {
5893    my $cmd = shift;
5894
5895    my ($action_wanted, $break_wanted, $watch_wanted) =
5896        _cmd_L_calc_wanted_flags(shift);
5897
5898    my $handle_db_line = sub {
5899        my ($l) = @_;
5900
5901        my ( $stop, $action ) = split( /\0/, $l );
5902
5903        if ($stop and $break_wanted) {
5904            print {$OUT} "    break if (", $stop, ")\n"
5905        }
5906
5907        if ($action && $action_wanted) {
5908            print {$OUT} "    action:  ", $action, "\n"
5909        }
5910
5911        return;
5912    };
5913
5914    # Breaks and actions are found together, so we look in the same place
5915    # for both.
5916    if ( $break_wanted or $action_wanted ) {
5917        _cmd_L_handle_breakpoints($handle_db_line);
5918    }
5919
5920    # Look for breaks in not-yet-compiled subs:
5921    if ( %postponed and $break_wanted ) {
5922        print {$OUT} "Postponed breakpoints in subroutines:\n";
5923        my $subname;
5924        SUBS_SCAN:
5925        for $subname ( keys %postponed ) {
5926            print {$OUT} " $subname\t$postponed{$subname}\n";
5927            if ($signal) {
5928                last SUBS_SCAN;
5929            }
5930        }
5931    } ## end if (%postponed and $break_wanted)
5932
5933    # Find files that have not-yet-loaded breaks:
5934    my @have = map {    # Combined keys
5935        keys %{ $postponed_file{$_} }
5936    } keys %postponed_file;
5937
5938    # If there are any, list them.
5939    if ( @have and ( $break_wanted or $action_wanted ) ) {
5940        _cmd_L_handle_postponed_breakpoints($handle_db_line);
5941    } ## end if (@have and ($break_wanted...
5942
5943    if ( %break_on_load and $break_wanted ) {
5944        print {$OUT} "Breakpoints on load:\n";
5945        BREAK_ON_LOAD: for my $filename ( keys %break_on_load ) {
5946            print {$OUT} " $filename\n";
5947            last BREAK_ON_LOAD if $signal;
5948        }
5949    } ## end if (%break_on_load and...
5950
5951    if ($watch_wanted and ( $trace & 2 )) {
5952        print {$OUT} "Watch-expressions:\n" if @to_watch;
5953        TO_WATCH: for my $expr (@to_watch) {
5954            print {$OUT} " $expr\n";
5955            last TO_WATCH if $signal;
5956        }
5957    }
5958
5959    return;
5960} ## end sub cmd_L
5961
5962=head3 C<cmd_M> - list modules (command)
5963
5964Just call C<list_modules>.
5965
5966=cut
5967
5968sub cmd_M {
5969    list_modules();
5970
5971    return;
5972}
5973
5974=head3 C<cmd_o> - options (command)
5975
5976If this is just C<o> by itself, we list the current settings via
5977C<dump_option>. If there's a nonblank value following it, we pass that on to
5978C<parse_options> for processing.
5979
5980=cut
5981
5982sub cmd_o {
5983    my $cmd = shift;
5984    my $opt = shift || '';    # opt[=val]
5985
5986    # Nonblank. Try to parse and process.
5987    if ( $opt =~ /^(\S.*)/ ) {
5988        parse_options($1);
5989    }
5990
5991    # Blank. List the current option settings.
5992    else {
5993        for (@options) {
5994            dump_option($_);
5995        }
5996    }
5997} ## end sub cmd_o
5998
5999=head3 C<cmd_O> - nonexistent in 5.8.x (command)
6000
6001Advises the user that the O command has been renamed.
6002
6003=cut
6004
6005sub cmd_O {
6006    print $OUT "The old O command is now the o command.\n";             # hint
6007    print $OUT "Use 'h' to get current command help synopsis or\n";     #
6008    print $OUT "use 'o CommandSet=pre580' to revert to old usage\n";    #
6009}
6010
6011=head3 C<cmd_v> - view window (command)
6012
6013Uses the C<$preview> variable set in the second C<BEGIN> block (q.v.) to
6014move back a few lines to list the selected line in context. Uses C<cmd_l>
6015to do the actual listing after figuring out the range of line to request.
6016
6017=cut
6018
6019use vars qw($preview);
6020
6021sub cmd_v {
6022    my $cmd  = shift;
6023    my $line = shift;
6024
6025    # Extract the line to list around. (Astute readers will have noted that
6026    # this pattern will match whether or not a numeric line is specified,
6027    # which means that we'll always enter this loop (though a non-numeric
6028    # argument results in no action at all)).
6029    if ( $line =~ /^(\d*)$/ ) {
6030
6031        # Total number of lines to list (a windowful).
6032        $incr = $window - 1;
6033
6034        # Set the start to the argument given (if there was one).
6035        $start = $1 if $1;
6036
6037        # Back up by the context amount.
6038        $start -= $preview;
6039
6040        # Put together a linespec that cmd_l will like.
6041        $line = $start . '-' . ( $start + $incr );
6042
6043        # List the lines.
6044        cmd_l( 'l', $line );
6045    } ## end if ($line =~ /^(\d*)$/)
6046} ## end sub cmd_v
6047
6048=head3 C<cmd_w> - add a watch expression (command)
6049
6050The 5.8 version of this command adds a watch expression if one is specified;
6051it does nothing if entered with no operands.
6052
6053We extract the expression, save it, evaluate it in the user's context, and
6054save the value. We'll re-evaluate it each time the debugger passes a line,
6055and will stop (see the code at the top of the command loop) if the value
6056of any of the expressions changes.
6057
6058=cut
6059
6060sub _add_watch_expr {
6061    my $expr = shift;
6062
6063    # ... save it.
6064    push @to_watch, $expr;
6065
6066    # Parameterize DB::eval and call it to get the expression's value
6067    # in the user's context. This version can handle expressions which
6068    # return a list value.
6069    $evalarg = $expr;
6070    # The &-call is here to ascertain the mutability of @_.
6071    my ($val) = join( ' ', &DB::eval);
6072    $val = ( defined $val ) ? "'$val'" : 'undef';
6073
6074    # Save the current value of the expression.
6075    push @old_watch, $val;
6076
6077    # We are now watching expressions.
6078    $trace |= 2;
6079
6080    return;
6081}
6082
6083sub cmd_w {
6084    my $cmd = shift;
6085
6086    # Null expression if no arguments.
6087    my $expr = shift || '';
6088
6089    # If expression is not null ...
6090    if ( $expr =~ /\A\S/ ) {
6091        _add_watch_expr($expr);
6092    } ## end if ($expr =~ /^(\S.*)/)
6093
6094    # You have to give one to get one.
6095    else {
6096        print $OUT "Adding a watch-expression requires an expression\n";  # hint
6097    }
6098
6099    return;
6100}
6101
6102=head3 C<cmd_W> - delete watch expressions (command)
6103
6104This command accepts either a watch expression to be removed from the list
6105of watch expressions, or C<*> to delete them all.
6106
6107If C<*> is specified, we simply empty the watch expression list and the
6108watch expression value list. We also turn off the bit that says we've got
6109watch expressions.
6110
6111If an expression (or partial expression) is specified, we pattern-match
6112through the expressions and remove the ones that match. We also discard
6113the corresponding values. If no watch expressions are left, we turn off
6114the I<watching expressions> bit.
6115
6116=cut
6117
6118sub cmd_W {
6119    my $cmd  = shift;
6120    my $expr = shift || '';
6121
6122    # Delete them all.
6123    if ( $expr eq '*' ) {
6124
6125        # Not watching now.
6126        $trace &= ~2;
6127
6128        print $OUT "Deleting all watch expressions ...\n";
6129
6130        # And all gone.
6131        @to_watch = @old_watch = ();
6132    }
6133
6134    # Delete one of them.
6135    elsif ( $expr =~ /^(\S.*)/ ) {
6136
6137        # Where we are in the list.
6138        my $i_cnt = 0;
6139
6140        # For each expression ...
6141        foreach (@to_watch) {
6142            my $val = $to_watch[$i_cnt];
6143
6144            # Does this one match the command argument?
6145            if ( $val eq $expr ) {    # =~ m/^\Q$i$/) {
6146                                      # Yes. Turn it off, and its value too.
6147                splice( @to_watch,  $i_cnt, 1 );
6148                splice( @old_watch, $i_cnt, 1 );
6149            }
6150            $i_cnt++;
6151        } ## end foreach (@to_watch)
6152
6153        # We don't bother to turn watching off because
6154        #  a) we don't want to stop calling watchfunction() if it exists
6155        #  b) foreach over a null list doesn't do anything anyway
6156
6157    } ## end elsif ($expr =~ /^(\S.*)/)
6158
6159    # No command arguments entered.
6160    else {
6161        print $OUT
6162          "Deleting a watch-expression requires an expression, or '*' for all\n"
6163          ;    # hint
6164    }
6165} ## end sub cmd_W
6166
6167### END of the API section
6168
6169=head1 SUPPORT ROUTINES
6170
6171These are general support routines that are used in a number of places
6172throughout the debugger.
6173
6174=head2 save
6175
6176save() saves the user's versions of globals that would mess us up in C<@saved>,
6177and installs the versions we like better.
6178
6179=cut
6180
6181sub save {
6182
6183    # Save eval failure, command failure, extended OS error, output field
6184    # separator, input record separator, output record separator and
6185    # the warning setting.
6186    @saved = ( $@, $!, $^E, $,, $/, $\, $^W );
6187
6188    $,  = "";      # output field separator is null string
6189    $/  = "\n";    # input record separator is newline
6190    $\  = "";      # output record separator is null string
6191    $^W = 0;       # warnings are off
6192} ## end sub save
6193
6194=head2 C<print_lineinfo> - show where we are now
6195
6196print_lineinfo prints whatever it is that it is handed; it prints it to the
6197C<$LINEINFO> filehandle instead of just printing it to STDOUT. This allows
6198us to feed line information to a slave editor without messing up the
6199debugger output.
6200
6201=cut
6202
6203sub print_lineinfo {
6204
6205    # Make the terminal sensible if we're not the primary debugger.
6206    resetterm(1) if $LINEINFO eq $OUT and $term_pid != $$;
6207    local $\ = '';
6208    local $, = '';
6209    # $LINEINFO may be undef if $noTTY is set or some other issue.
6210    if ($LINEINFO)
6211    {
6212        print {$LINEINFO} @_;
6213    }
6214} ## end sub print_lineinfo
6215
6216=head2 C<postponed_sub>
6217
6218Handles setting postponed breakpoints in subroutines once they're compiled.
6219For breakpoints, we use C<DB::find_sub> to locate the source file and line
6220range for the subroutine, then mark the file as having a breakpoint,
6221temporarily switch the C<*dbline> glob over to the source file, and then
6222search the given range of lines to find a breakable line. If we find one,
6223we set the breakpoint on it, deleting the breakpoint from C<%postponed>.
6224
6225=cut
6226
6227# The following takes its argument via $evalarg to preserve current @_
6228
6229sub postponed_sub {
6230
6231    # Get the subroutine name.
6232    my $subname = shift;
6233
6234    # If this is a 'break +<n> if <condition>' ...
6235    if ( $postponed{$subname} =~ s/^break\s([+-]?\d+)\s+if\s// ) {
6236
6237        # If there's no offset, use '+0'.
6238        my $offset = $1 || 0;
6239
6240        # find_sub's value is 'fullpath-filename:start-stop'. It's
6241        # possible that the filename might have colons in it too.
6242        my ( $file, $i ) = ( find_sub($subname) =~ /^(.*):(\d+)-.*$/ );
6243        if ($i) {
6244
6245            # We got the start line. Add the offset '+<n>' from
6246            # $postponed{subname}.
6247            $i += $offset;
6248
6249            # Switch to the file this sub is in, temporarily.
6250            local *dbline = $main::{ '_<' . $file };
6251
6252            # No warnings, please.
6253            local $^W = 0;    # != 0 is magical below
6254
6255            # This file's got a breakpoint in it.
6256            $had_breakpoints{$file} |= 1;
6257
6258            # Last line in file.
6259            $max = $#dbline;
6260
6261            # Search forward until we hit a breakable line or get to
6262            # the end of the file.
6263            ++$i until $dbline[$i] != 0 or $i >= $max;
6264
6265            # Copy the breakpoint in and delete it from %postponed.
6266            $dbline{$i} = delete $postponed{$subname};
6267        } ## end if ($i)
6268
6269        # find_sub didn't find the sub.
6270        else {
6271            local $\ = '';
6272            print $OUT "Subroutine $subname not found.\n";
6273        }
6274        return;
6275    } ## end if ($postponed{$subname...
6276    elsif ( $postponed{$subname} eq 'compile' ) { $signal = 1 }
6277
6278    #print $OUT "In postponed_sub for '$subname'.\n";
6279} ## end sub postponed_sub
6280
6281=head2 C<postponed>
6282
6283Called after each required file is compiled, but before it is executed;
6284also called if the name of a just-compiled subroutine is a key of
6285C<%postponed>. Propagates saved breakpoints (from C<b compile>, C<b load>,
6286etc.) into the just-compiled code.
6287
6288If this is a C<require>'d file, the incoming parameter is the glob
6289C<*{"_<$filename"}>, with C<$filename> the name of the C<require>'d file.
6290
6291If it's a subroutine, the incoming parameter is the subroutine name.
6292
6293=cut
6294
6295sub postponed {
6296
6297    # If there's a break, process it.
6298    if ($ImmediateStop) {
6299
6300        # Right, we've stopped. Turn it off.
6301        $ImmediateStop = 0;
6302
6303        # Enter the command loop when DB::DB gets called.
6304        $signal = 1;
6305    }
6306
6307    # If this is a subroutine, let postponed_sub() deal with it.
6308    if (ref(\$_[0]) ne 'GLOB') {
6309        return postponed_sub(@_);
6310    }
6311
6312    # Not a subroutine. Deal with the file.
6313    local *dbline = shift;
6314    my $filename = $dbline;
6315    $filename =~ s/^_<//;
6316    local $\ = '';
6317    $signal = 1, print $OUT "'$filename' loaded...\n"
6318      if $break_on_load{$filename};
6319    print_lineinfo( ' ' x $stack_depth, "Package $filename.\n" ) if $frame;
6320
6321    # Do we have any breakpoints to put in this file?
6322    return unless $postponed_file{$filename};
6323
6324    # Yes. Mark this file as having breakpoints.
6325    $had_breakpoints{$filename} |= 1;
6326
6327    # "Cannot be done: insufficient magic" - we can't just put the
6328    # breakpoints saved in %postponed_file into %dbline by assigning
6329    # the whole hash; we have to do it one item at a time for the
6330    # breakpoints to be set properly.
6331    #%dbline = %{$postponed_file{$filename}};
6332
6333    # Set the breakpoints, one at a time.
6334    my $key;
6335
6336    for $key ( keys %{ $postponed_file{$filename} } ) {
6337
6338        # Stash the saved breakpoint into the current file's magic line array.
6339        $dbline{$key} = ${ $postponed_file{$filename} }{$key};
6340    }
6341
6342    # This file's been compiled; discard the stored breakpoints.
6343    delete $postponed_file{$filename};
6344
6345} ## end sub postponed
6346
6347=head2 C<dumpit>
6348
6349C<dumpit> is the debugger's wrapper around dumpvar.pl.
6350
6351It gets a filehandle (to which C<dumpvar.pl>'s output will be directed) and
6352a reference to a variable (the thing to be dumped) as its input.
6353
6354The incoming filehandle is selected for output (C<dumpvar.pl> is printing to
6355the currently-selected filehandle, thank you very much). The current
6356values of the package globals C<$single> and C<$trace> are backed up in
6357lexicals, and they are turned off (this keeps the debugger from trying
6358to single-step through C<dumpvar.pl> (I think.)). C<$frame> is localized to
6359preserve its current value and it is set to zero to prevent entry/exit
6360messages from printing, and C<$doret> is localized as well and set to -2 to
6361prevent return values from being shown.
6362
6363C<dumpit()> then checks to see if it needs to load C<dumpvar.pl> and
6364tries to load it (note: if you have a C<dumpvar.pl>  ahead of the
6365installed version in C<@INC>, yours will be used instead. Possible security
6366problem?).
6367
6368It then checks to see if the subroutine C<main::dumpValue> is now defined
6369it should have been defined by C<dumpvar.pl>). If it has, C<dumpit()>
6370localizes the globals necessary for things to be sane when C<main::dumpValue()>
6371is called, and picks up the variable to be dumped from the parameter list.
6372
6373It checks the package global C<%options> to see if there's a C<dumpDepth>
6374specified. If not, -1 is assumed; if so, the supplied value gets passed on to
6375C<dumpvar.pl>. This tells C<dumpvar.pl> where to leave off when dumping a
6376structure: -1 means dump everything.
6377
6378C<dumpValue()> is then called if possible; if not, C<dumpit()>just prints a
6379warning.
6380
6381In either case, C<$single>, C<$trace>, C<$frame>, and C<$doret> are restored
6382and we then return to the caller.
6383
6384=cut
6385
6386sub dumpit {
6387
6388    # Save the current output filehandle and switch to the one
6389    # passed in as the first parameter.
6390    my $savout = select(shift);
6391
6392    # Save current settings of $single and $trace, and then turn them off.
6393    my $osingle = $single;
6394    my $otrace  = $trace;
6395    $single = $trace = 0;
6396
6397    # XXX Okay, what do $frame and $doret do, again?
6398    local $frame = 0;
6399    local $doret = -2;
6400
6401    # Load dumpvar.pl unless we've already got the sub we need from it.
6402    unless ( defined &main::dumpValue ) {
6403        do 'dumpvar.pl' or die $@;
6404    }
6405
6406    # If the load succeeded (or we already had dumpvalue()), go ahead
6407    # and dump things.
6408    if ( defined &main::dumpValue ) {
6409        local $\ = '';
6410        local $, = '';
6411        local $" = ' ';
6412        my $v = shift;
6413        my $maxdepth = shift || $option{dumpDepth};
6414        $maxdepth = -1 unless defined $maxdepth;    # -1 means infinite depth
6415        main::dumpValue( $v, $maxdepth );
6416    } ## end if (defined &main::dumpValue)
6417
6418    # Oops, couldn't load dumpvar.pl.
6419    else {
6420        local $\ = '';
6421        print $OUT "dumpvar.pl not available.\n";
6422    }
6423
6424    # Reset $single and $trace to their old values.
6425    $single = $osingle;
6426    $trace  = $otrace;
6427
6428    # Restore the old filehandle.
6429    select($savout);
6430} ## end sub dumpit
6431
6432=head2 C<print_trace>
6433
6434C<print_trace>'s job is to print a stack trace. It does this via the
6435C<dump_trace> routine, which actually does all the ferreting-out of the
6436stack trace data. C<print_trace> takes care of formatting it nicely and
6437printing it to the proper filehandle.
6438
6439Parameters:
6440
6441=over 4
6442
6443=item *
6444
6445The filehandle to print to.
6446
6447=item *
6448
6449How many frames to skip before starting trace.
6450
6451=item *
6452
6453How many frames to print.
6454
6455=item *
6456
6457A flag: if true, print a I<short> trace without filenames, line numbers, or arguments
6458
6459=back
6460
6461The original comment below seems to be noting that the traceback may not be
6462correct if this routine is called in a tied method.
6463
6464=cut
6465
6466# Tied method do not create a context, so may get wrong message:
6467
6468sub print_trace {
6469    local $\ = '';
6470    my $fh = shift;
6471
6472    # If this is going to a slave editor, but we're not the primary
6473    # debugger, reset it first.
6474    resetterm(1)
6475      if $fh        eq $LINEINFO    # slave editor
6476      and $LINEINFO eq $OUT         # normal output
6477      and $term_pid != $$;          # not the primary
6478
6479    # Collect the actual trace information to be formatted.
6480    # This is an array of hashes of subroutine call info.
6481    my @sub = dump_trace( $_[0] + 1, $_[1] );
6482
6483    # Grab the "short report" flag from @_.
6484    my $short = $_[2];              # Print short report, next one for sub name
6485
6486    # Run through the traceback info, format it, and print it.
6487    my $s;
6488    for my $i (0 .. $#sub) {
6489
6490        # Drop out if the user has lost interest and hit control-C.
6491        last if $signal;
6492
6493        # Set the separator so arrays print nice.
6494        local $" = ', ';
6495
6496        # Grab and stringify the arguments if they are there.
6497        my $args =
6498          defined $sub[$i]{args}
6499          ? "(@{ $sub[$i]{args} })"
6500          : '';
6501
6502        # Shorten them up if $maxtrace says they're too long.
6503        $args = ( substr $args, 0, $maxtrace - 3 ) . '...'
6504          if length $args > $maxtrace;
6505
6506        # Get the file name.
6507        my $file = $sub[$i]{file};
6508
6509        # Put in a filename header if short is off.
6510        $file = $file eq '-e' ? $file : "file '$file'" unless $short;
6511
6512        # Get the actual sub's name, and shorten to $maxtrace's requirement.
6513        $s = $sub[$i]{'sub'};
6514        $s = ( substr $s, 0, $maxtrace - 3 ) . '...' if length $s > $maxtrace;
6515
6516        # Short report uses trimmed file and sub names.
6517        if ($short) {
6518            my $sub = @_ >= 4 ? $_[3] : $s;
6519            print $fh "$sub[$i]{context}=$sub$args from $file:$sub[$i]{line}\n";
6520        } ## end if ($short)
6521
6522        # Non-short report includes full names.
6523        else {
6524            print $fh "$sub[$i]{context} = $s$args"
6525              . " called from $file"
6526              . " line $sub[$i]{line}\n";
6527        }
6528    } ## end for my $i (0 .. $#sub)
6529} ## end sub print_trace
6530
6531=head2 dump_trace(skip[,count])
6532
6533Actually collect the traceback information available via C<caller()>. It does
6534some filtering and cleanup of the data, but mostly it just collects it to
6535make C<print_trace()>'s job easier.
6536
6537C<skip> defines the number of stack frames to be skipped, working backwards
6538from the most current. C<count> determines the total number of frames to
6539be returned; all of them (well, the first 10^9) are returned if C<count>
6540is omitted.
6541
6542This routine returns a list of hashes, from most-recent to least-recent
6543stack frame. Each has the following keys and values:
6544
6545=over 4
6546
6547=item * C<context> - C<.> (null), C<$> (scalar), or C<@> (array)
6548
6549=item * C<sub> - subroutine name, or C<eval> information
6550
6551=item * C<args> - undef, or a reference to an array of arguments
6552
6553=item * C<file> - the file in which this item was defined (if any)
6554
6555=item * C<line> - the line on which it was defined
6556
6557=back
6558
6559=cut
6560
6561sub _dump_trace_calc_saved_single_arg
6562{
6563    my ($nothard, $arg) = @_;
6564
6565    my $type;
6566    if ( not defined $arg ) {    # undefined parameter
6567        return "undef";
6568    }
6569
6570    elsif ( $nothard and tied $arg ) {    # tied parameter
6571        return "tied";
6572    }
6573    elsif ( $nothard and $type = ref $arg ) {    # reference
6574        return "ref($type)";
6575    }
6576    else {                                       # can be stringified
6577        local $_ =
6578        "$arg";    # Safe to stringify now - should not call f().
6579
6580        # Backslash any single-quotes or backslashes.
6581        s/([\'\\])/\\$1/g;
6582
6583        # Single-quote it unless it's a number or a colon-separated
6584        # name.
6585        s/(.*)/'$1'/s
6586        unless /^(?: -?[\d.]+ | \*[\w:]* )$/x;
6587
6588        # Turn high-bit characters into meta-whatever, and controls into like
6589        # '^D'.
6590        require 'meta_notation.pm';
6591        $_ = _meta_notation($_) if /[[:^print:]]/a;
6592
6593        return $_;
6594    }
6595}
6596
6597sub _dump_trace_calc_save_args {
6598    my ($nothard) = @_;
6599
6600    return [
6601        map { _dump_trace_calc_saved_single_arg($nothard, $_) } @args
6602    ];
6603}
6604
6605sub dump_trace {
6606
6607    # How many levels to skip.
6608    my $skip = shift;
6609
6610    # How many levels to show. (1e9 is a cheap way of saying "all of them";
6611    # it's unlikely that we'll have more than a billion stack frames. If you
6612    # do, you've got an awfully big machine...)
6613    my $count = shift || 1e9;
6614
6615    # We increment skip because caller(1) is the first level *back* from
6616    # the current one.  Add $skip to the count of frames so we have a
6617    # simple stop criterion, counting from $skip to $count+$skip.
6618    $skip++;
6619    $count += $skip;
6620
6621    # These variables are used to capture output from caller();
6622    my ( $p, $file, $line, $sub, $h, $context );
6623
6624    my ( $e, $r, @sub, $args );
6625
6626    # XXX Okay... why'd we do that?
6627    my $nothard = not $frame & 8;
6628    local $frame = 0;
6629
6630    # Do not want to trace this.
6631    my $otrace = $trace;
6632    $trace = 0;
6633
6634    # Start out at the skip count.
6635    # If we haven't reached the number of frames requested, and caller() is
6636    # still returning something, stay in the loop. (If we pass the requested
6637    # number of stack frames, or we run out - caller() returns nothing - we
6638    # quit.
6639    # Up the stack frame index to go back one more level each time.
6640    for (
6641        my $i = $skip ;
6642        $i < $count
6643        and ( $p, $file, $line, $sub, $h, $context, $e, $r ) = caller($i) ;
6644        $i++
6645    )
6646    {
6647        # if the sub has args ($h true), make an anonymous array of the
6648        # dumped args.
6649        my $args = $h ? _dump_trace_calc_save_args($nothard) : undef;
6650
6651        # If context is true, this is array (@)context.
6652        # If context is false, this is scalar ($) context.
6653        # If neither, context isn't defined. (This is apparently a 'can't
6654        # happen' trap.)
6655        $context = $context ? '@' : ( defined $context ? "\$" : '.' );
6656
6657        # remove trailing newline-whitespace-semicolon-end of line sequence
6658        # from the eval text, if any.
6659        $e =~ s/\n\s*\;\s*\Z// if $e;
6660
6661        # Escape backslashed single-quotes again if necessary.
6662        $e =~ s/([\\\'])/\\$1/g if $e;
6663
6664        # if the require flag is true, the eval text is from a require.
6665        if ($r) {
6666            $sub = "require '$e'";
6667        }
6668
6669        # if it's false, the eval text is really from an eval.
6670        elsif ( defined $r ) {
6671            $sub = "eval '$e'";
6672        }
6673
6674        # If the sub is '(eval)', this is a block eval, meaning we don't
6675        # know what the eval'ed text actually was.
6676        elsif ( $sub eq '(eval)' ) {
6677            $sub = "eval {...}";
6678        }
6679
6680        # Stick the collected information into @sub as an anonymous hash.
6681        push(
6682            @sub,
6683            {
6684                context => $context,
6685                sub     => $sub,
6686                args    => $args,
6687                file    => $file,
6688                line    => $line
6689            }
6690        );
6691
6692        # Stop processing frames if the user hit control-C.
6693        last if $signal;
6694    } ## end for ($i = $skip ; $i < ...
6695
6696    # Restore the trace value again.
6697    $trace = $otrace;
6698    @sub;
6699} ## end sub dump_trace
6700
6701=head2 C<action()>
6702
6703C<action()> takes input provided as the argument to an add-action command,
6704either pre- or post-, and makes sure it's a complete command. It doesn't do
6705any fancy parsing; it just keeps reading input until it gets a string
6706without a trailing backslash.
6707
6708=cut
6709
6710sub action {
6711    my $action = shift;
6712
6713    while ( $action =~ s/\\$// ) {
6714
6715        # We have a backslash on the end. Read more.
6716        $action .= gets();
6717    } ## end while ($action =~ s/\\$//)
6718
6719    # Return the assembled action.
6720    $action;
6721} ## end sub action
6722
6723=head2 unbalanced
6724
6725This routine mostly just packages up a regular expression to be used
6726to check that the thing it's being matched against has properly-matched
6727curly braces.
6728
6729Of note is the definition of the C<$balanced_brace_re> global via C<||=>, which
6730speeds things up by only creating the qr//'ed expression once; if it's
6731already defined, we don't try to define it again. A speed hack.
6732
6733=cut
6734
6735use vars qw($balanced_brace_re);
6736
6737sub unbalanced {
6738
6739    # I hate using globals!
6740    $balanced_brace_re ||= qr{
6741        ^ \{
6742             (?:
6743                 (?> [^{}] + )              # Non-parens without backtracking
6744                |
6745                 (??{ $balanced_brace_re }) # Group with matching parens
6746              ) *
6747          \} $
6748   }x;
6749    return $_[0] !~ m/$balanced_brace_re/;
6750} ## end sub unbalanced
6751
6752=head2 C<gets()>
6753
6754C<gets()> is a primitive (very primitive) routine to read continuations.
6755It was devised for reading continuations for actions.
6756it just reads more input with C<readline()> and returns it.
6757
6758=cut
6759
6760sub gets {
6761    return DB::readline("cont: ");
6762}
6763
6764=head2 C<_db_system()> - handle calls to<system()> without messing up the debugger
6765
6766The C<system()> function assumes that it can just go ahead and use STDIN and
6767STDOUT, but under the debugger, we want it to use the debugger's input and
6768outout filehandles.
6769
6770C<_db_system()> socks away the program's STDIN and STDOUT, and then substitutes
6771the debugger's IN and OUT filehandles for them. It does the C<system()> call,
6772and then puts everything back again.
6773
6774=cut
6775
6776sub _db_system {
6777
6778    # We save, change, then restore STDIN and STDOUT to avoid fork() since
6779    # some non-Unix systems can do system() but have problems with fork().
6780    open( SAVEIN,  "<&STDIN" )  || _db_warn("Can't save STDIN");
6781    open( SAVEOUT, ">&STDOUT" ) || _db_warn("Can't save STDOUT");
6782    open( STDIN,   "<&IN" )     || _db_warn("Can't redirect STDIN");
6783    open( STDOUT,  ">&OUT" )    || _db_warn("Can't redirect STDOUT");
6784
6785    # XXX: using csh or tcsh destroys sigint retvals!
6786    system(@_);
6787    open( STDIN,  "<&SAVEIN" )  || _db_warn("Can't restore STDIN");
6788    open( STDOUT, ">&SAVEOUT" ) || _db_warn("Can't restore STDOUT");
6789    close(SAVEIN);
6790    close(SAVEOUT);
6791
6792    # most of the $? crud was coping with broken cshisms
6793    if ( $? >> 8 ) {
6794        _db_warn( "(Command exited ", ( $? >> 8 ), ")\n" );
6795    }
6796    elsif ($?) {
6797        _db_warn(
6798            "(Command died of SIG#",
6799            ( $? & 127 ),
6800            ( ( $? & 128 ) ? " -- core dumped" : "" ),
6801            ")", "\n"
6802        );
6803    } ## end elsif ($?)
6804
6805    return $?;
6806
6807} ## end sub system
6808
6809*system = \&_db_system;
6810
6811=head1 TTY MANAGEMENT
6812
6813The subs here do some of the terminal management for multiple debuggers.
6814
6815=head2 setterm
6816
6817Top-level function called when we want to set up a new terminal for use
6818by the debugger.
6819
6820If the C<noTTY> debugger option was set, we'll either use the terminal
6821supplied (the value of the C<noTTY> option), or we'll use C<Term::Rendezvous>
6822to find one. If we're a forked debugger, we call C<resetterm> to try to
6823get a whole new terminal if we can.
6824
6825In either case, we set up the terminal next. If the C<ReadLine> option was
6826true, we'll get a C<Term::ReadLine> object for the current terminal and save
6827the appropriate attributes. We then
6828
6829=cut
6830
6831use vars qw($ornaments);
6832use vars qw($rl_attribs);
6833sub setterm {
6834
6835    # Load Term::Readline, but quietly; don't debug it and don't trace it.
6836    local $frame = 0;
6837    local $doret = -2;
6838    _DB__use_full_path(sub {
6839	require Term::ReadLine;
6840    });
6841
6842
6843    # If noTTY is set, but we have a TTY name, go ahead and hook up to it.
6844    if ($notty) {
6845        if ($tty) {
6846            my ( $i, $o ) = split $tty, /,/;
6847            $o = $i unless defined $o;
6848            open( IN,  '<', $i ) or die "Cannot open TTY '$i' for read: $!";
6849            open( OUT, '>', $o ) or die "Cannot open TTY '$o' for write: $!";
6850            $IN  = \*IN;
6851            $OUT = \*OUT;
6852            _autoflush($OUT);
6853        } ## end if ($tty)
6854
6855        # We don't have a TTY - try to find one via Term::Rendezvous.
6856        else {
6857            require Term::Rendezvous;
6858
6859            # See if we have anything to pass to Term::Rendezvous.
6860            # Use $HOME/.perldbtty$$ if not.
6861            my $rv = $ENV{PERLDB_NOTTY} || "$ENV{HOME}/.perldbtty$$";
6862
6863            # Rendezvous and get the filehandles.
6864            my $term_rv = Term::Rendezvous->new( $rv );
6865            $IN  = $term_rv->IN;
6866            $OUT = $term_rv->OUT;
6867        } ## end else [ if ($tty)
6868    } ## end if ($notty)
6869
6870    # We're a daughter debugger. Try to fork off another TTY.
6871    if ( $term_pid eq '-1' ) {    # In a TTY with another debugger
6872        resetterm(2);
6873    }
6874
6875    # If we shouldn't use Term::ReadLine, don't.
6876    if ( !$rl ) {
6877        $term = Term::ReadLine::Stub->new( 'perldb', $IN, $OUT );
6878    }
6879
6880    # We're using Term::ReadLine. Get all the attributes for this terminal.
6881    else {
6882        $term = Term::ReadLine->new( 'perldb', $IN, $OUT );
6883
6884        $rl_attribs = $term->Attribs;
6885        $rl_attribs->{basic_word_break_characters} .= '-:+/*,[])}'
6886          if defined $rl_attribs->{basic_word_break_characters}
6887          and index( $rl_attribs->{basic_word_break_characters}, ":" ) == -1;
6888        $rl_attribs->{special_prefixes} = '$@&%';
6889        $rl_attribs->{completer_word_break_characters} .= '$@&%';
6890        $rl_attribs->{completion_function} = \&db_complete;
6891    } ## end else [ if (!$rl)
6892
6893    # Set up the LINEINFO filehandle.
6894    $LINEINFO = $OUT     unless defined $LINEINFO;
6895    $lineinfo = $console unless defined $lineinfo;
6896
6897    $term->MinLine(2);
6898
6899    load_hist();
6900
6901    if ( $term->Features->{setHistory} and "@hist" ne "?" ) {
6902        $term->SetHistory(@hist);
6903    }
6904
6905    # XXX Ornaments are turned on unconditionally, which is not
6906    # always a good thing.
6907    ornaments($ornaments) if defined $ornaments;
6908    $term_pid = $$;
6909} ## end sub setterm
6910
6911sub load_hist {
6912    $histfile //= option_val("HistFile", undef);
6913    return unless defined $histfile;
6914    open my $fh, "<", $histfile or return;
6915    local $/ = "\n";
6916    @hist = ();
6917    while (<$fh>) {
6918        chomp;
6919        push @hist, $_;
6920    }
6921    close $fh;
6922}
6923
6924sub save_hist {
6925    return unless defined $histfile;
6926    eval { require File::Path } or return;
6927    eval { require File::Basename } or return;
6928    File::Path::mkpath(File::Basename::dirname($histfile));
6929    open my $fh, ">", $histfile or die "Could not open '$histfile': $!";
6930    $histsize //= option_val("HistSize",100);
6931    my @copy = grep { $_ ne '?' } @hist;
6932    my $start = scalar(@copy) > $histsize ? scalar(@copy)-$histsize : 0;
6933    for ($start .. $#copy) {
6934        print $fh "$copy[$_]\n";
6935    }
6936    close $fh or die "Could not write '$histfile': $!";
6937}
6938
6939=head1 GET_FORK_TTY EXAMPLE FUNCTIONS
6940
6941When the process being debugged forks, or the process invokes a command
6942via C<system()> which starts a new debugger, we need to be able to get a new
6943C<IN> and C<OUT> filehandle for the new debugger. Otherwise, the two processes
6944fight over the terminal, and you can never quite be sure who's going to get the
6945input you're typing.
6946
6947C<get_fork_TTY> is a glob-aliased function which calls the real function that
6948is tasked with doing all the necessary operating system mojo to get a new
6949TTY (and probably another window) and to direct the new debugger to read and
6950write there.
6951
6952The debugger provides C<get_fork_TTY> functions which work for TCP
6953socket servers, X11, OS/2, and Mac OS X. Other systems are not
6954supported. You are encouraged to write C<get_fork_TTY> functions which
6955work for I<your> platform and contribute them.
6956
6957=head3 C<socket_get_fork_TTY>
6958
6959=cut
6960
6961sub connect_remoteport {
6962    require IO::Socket;
6963
6964    my $socket = IO::Socket::INET->new(
6965        Timeout  => '10',
6966        PeerAddr => $remoteport,
6967        Proto    => 'tcp',
6968    );
6969    if ( ! $socket ) {
6970        die "Unable to connect to remote host: $remoteport\n";
6971    }
6972    return $socket;
6973}
6974
6975sub socket_get_fork_TTY {
6976    $tty = $LINEINFO = $IN = $OUT = connect_remoteport();
6977
6978    # Do I need to worry about setting $term?
6979
6980    reset_IN_OUT( $IN, $OUT );
6981    return '';
6982}
6983
6984=head3 C<xterm_get_fork_TTY>
6985
6986This function provides the C<get_fork_TTY> function for X11. If a
6987program running under the debugger forks, a new <xterm> window is opened and
6988the subsidiary debugger is directed there.
6989
6990The C<open()> call is of particular note here. We have the new C<xterm>
6991we're spawning route file number 3 to STDOUT, and then execute the C<tty>
6992command (which prints the device name of the TTY we'll want to use for input
6993and output to STDOUT, then C<sleep> for a very long time, routing this output
6994to file number 3. This way we can simply read from the <XT> filehandle (which
6995is STDOUT from the I<commands> we ran) to get the TTY we want to use.
6996
6997Only works if C<xterm> is in your path and C<$ENV{DISPLAY}>, etc. are
6998properly set up.
6999
7000=cut
7001
7002sub xterm_get_fork_TTY {
7003    ( my $name = $0 ) =~ s,^.*[/\\],,s;
7004    open XT,
7005qq[3>&1 xterm -title "Daughter Perl debugger $pids $name" -e sh -c 'tty 1>&3;\
7006 sleep 10000000' |];
7007
7008    # Get the output from 'tty' and clean it up a little.
7009    my $tty = <XT>;
7010    chomp $tty;
7011
7012    $pidprompt = '';    # Shown anyway in titlebar
7013
7014    # We need $term defined or we can not switch to the newly created xterm
7015    if ($tty ne '' && !defined $term) {
7016    	_DB__use_full_path(sub {
7017	    require Term::ReadLine;
7018	});
7019        if ( !$rl ) {
7020            $term = Term::ReadLine::Stub->new( 'perldb', $IN, $OUT );
7021        }
7022        else {
7023            $term = Term::ReadLine->new( 'perldb', $IN, $OUT );
7024        }
7025    }
7026    # There's our new TTY.
7027    return $tty;
7028} ## end sub xterm_get_fork_TTY
7029
7030=head3 C<os2_get_fork_TTY>
7031
7032XXX It behooves an OS/2 expert to write the necessary documentation for this!
7033
7034=cut
7035
7036# This example function resets $IN, $OUT itself
7037my $c_pipe = 0;
7038sub os2_get_fork_TTY { # A simplification of the following (and works without):
7039    local $\  = '';
7040    ( my $name = $0 ) =~ s,^.*[/\\],,s;
7041    my %opt = ( title => "Daughter Perl debugger $pids $name",
7042        ($rl ? (read_by_key => 1) : ()) );
7043    require OS2::Process;
7044    my ($in, $out, $pid) = eval { OS2::Process::io_term(related => 0, %opt) }
7045      or return;
7046    $pidprompt = '';    # Shown anyway in titlebar
7047    reset_IN_OUT($in, $out);
7048    $tty = '*reset*';
7049    return '';          # Indicate that reset_IN_OUT is called
7050} ## end sub os2_get_fork_TTY
7051
7052=head3 C<macosx_get_fork_TTY>
7053
7054The Mac OS X version uses AppleScript to tell Terminal.app to create
7055a new window.
7056
7057=cut
7058
7059# Notes about Terminal.app's AppleScript support,
7060# (aka things that might break in future OS versions).
7061#
7062# The "do script" command doesn't return a reference to the new window
7063# it creates, but since it appears frontmost and windows are enumerated
7064# front to back, we can use "first window" === "window 1".
7065#
7066# Since "do script" is implemented by supplying the argument (plus a
7067# return character) as terminal input, there's a potential race condition
7068# where the debugger could beat the shell to reading the command.
7069# To prevent this, we wait for the screen to clear before proceeding.
7070#
7071# 10.3 and 10.4:
7072# There's no direct accessor for the tty device name, so we fiddle
7073# with the window title options until it says what we want.
7074#
7075# 10.5:
7076# There _is_ a direct accessor for the tty device name, _and_ there's
7077# a new possible component of the window title (the name of the settings
7078# set).  A separate version is needed.
7079
7080my @script_versions=
7081
7082    ([237, <<'__LEOPARD__'],
7083tell application "Terminal"
7084    do script "clear;exec sleep 100000"
7085    tell first tab of first window
7086        copy tty to thetty
7087        set custom title to "forked perl debugger"
7088        set title displays custom title to true
7089        repeat while (length of first paragraph of (get contents)) > 0
7090            delay 0.1
7091        end repeat
7092    end tell
7093end tell
7094thetty
7095__LEOPARD__
7096
7097     [100, <<'__JAGUAR_TIGER__'],
7098tell application "Terminal"
7099    do script "clear;exec sleep 100000"
7100    tell first window
7101        set title displays shell path to false
7102        set title displays window size to false
7103        set title displays file name to false
7104        set title displays device name to true
7105        set title displays custom title to true
7106        set custom title to ""
7107        copy "/dev/" & name to thetty
7108        set custom title to "forked perl debugger"
7109        repeat while (length of first paragraph of (get contents)) > 0
7110            delay 0.1
7111        end repeat
7112    end tell
7113end tell
7114thetty
7115__JAGUAR_TIGER__
7116
7117);
7118
7119sub macosx_get_fork_TTY
7120{
7121    my($version,$script,$pipe,$tty);
7122
7123    return unless $version=$ENV{TERM_PROGRAM_VERSION};
7124    foreach my $entry (@script_versions) {
7125        if ($version>=$entry->[0]) {
7126            $script=$entry->[1];
7127            last;
7128        }
7129    }
7130    return unless defined($script);
7131    return unless open($pipe,'-|','/usr/bin/osascript','-e',$script);
7132    $tty=readline($pipe);
7133    close($pipe);
7134    return unless defined($tty) && $tty =~ m(^/dev/);
7135    chomp $tty;
7136    return $tty;
7137}
7138
7139=head3 C<tmux_get_fork_TTY>
7140
7141Creates a split window for subprocesses when a process running under the
7142perl debugger in Tmux forks.
7143
7144=cut
7145
7146sub tmux_get_fork_TTY {
7147    return unless $ENV{TMUX};
7148
7149    my $pipe;
7150
7151    my $status = open $pipe, '-|', 'tmux', 'split-window',
7152        '-P', '-F', '#{pane_tty}', 'sleep 100000';
7153
7154    if ( !$status ) {
7155        return;
7156    }
7157
7158    my $tty = <$pipe>;
7159    close $pipe;
7160
7161    if ( $tty ) {
7162        chomp $tty;
7163
7164        if ( !defined $term ) {
7165            require Term::ReadLine;
7166            if ( !$rl ) {
7167                $term = Term::ReadLine::Stub->new( 'perldb', $IN, $OUT );
7168            }
7169            else {
7170                $term = Term::ReadLine->new( 'perldb', $IN, $OUT );
7171            }
7172        }
7173    }
7174
7175    return $tty;
7176}
7177
7178=head2 C<create_IN_OUT($flags)>
7179
7180Create a new pair of filehandles, pointing to a new TTY. If impossible,
7181try to diagnose why.
7182
7183Flags are:
7184
7185=over 4
7186
7187=item * 1 - Don't know how to create a new TTY.
7188
7189=item * 2 - Debugger has forked, but we can't get a new TTY.
7190
7191=item * 4 - standard debugger startup is happening.
7192
7193=back
7194
7195=cut
7196
7197use vars qw($fork_TTY);
7198
7199sub create_IN_OUT {    # Create a window with IN/OUT handles redirected there
7200
7201    # If we know how to get a new TTY, do it! $in will have
7202    # the TTY name if get_fork_TTY works.
7203    my $in = get_fork_TTY(@_) if defined &get_fork_TTY;
7204
7205    # It used to be that
7206    $in = $fork_TTY if defined $fork_TTY;    # Backward compatibility
7207
7208    if ( not defined $in ) {
7209        my $why = shift;
7210
7211        # We don't know how.
7212        print_help(<<EOP) if $why == 1;
7213I<#########> Forked, but do not know how to create a new B<TTY>. I<#########>
7214EOP
7215
7216        # Forked debugger.
7217        print_help(<<EOP) if $why == 2;
7218I<#########> Daughter session, do not know how to change a B<TTY>. I<#########>
7219  This may be an asynchronous session, so the parent debugger may be active.
7220EOP
7221
7222        # Note that both debuggers are fighting over the same input.
7223        print_help(<<EOP) if $why != 4;
7224  Since two debuggers fight for the same TTY, input is severely entangled.
7225
7226EOP
7227        print_help(<<EOP);
7228  I know how to switch the output to a different window in xterms, OS/2
7229  consoles, and Mac OS X Terminal.app only.  For a manual switch, put the name
7230  of the created I<TTY> in B<\$DB::fork_TTY>, or define a function
7231  B<DB::get_fork_TTY()> returning this.
7232
7233  On I<UNIX>-like systems one can get the name of a I<TTY> for the given window
7234  by typing B<tty>, and disconnect the I<shell> from I<TTY> by B<sleep 1000000>.
7235
7236EOP
7237    } ## end if (not defined $in)
7238    elsif ( $in ne '' ) {
7239        TTY($in);
7240    }
7241    else {
7242        $console = '';    # Indicate no need to open-from-the-console
7243    }
7244    undef $fork_TTY;
7245} ## end sub create_IN_OUT
7246
7247=head2 C<resetterm>
7248
7249Handles rejiggering the prompt when we've forked off a new debugger.
7250
7251If the new debugger happened because of a C<system()> that invoked a
7252program under the debugger, the arrow between the old pid and the new
7253in the prompt has I<two> dashes instead of one.
7254
7255We take the current list of pids and add this one to the end. If there
7256isn't any list yet, we make one up out of the initial pid associated with
7257the terminal and our new pid, sticking an arrow (either one-dashed or
7258two dashed) in between them.
7259
7260If C<CreateTTY> is off, or C<resetterm> was called with no arguments,
7261we don't try to create a new IN and OUT filehandle. Otherwise, we go ahead
7262and try to do that.
7263
7264=cut
7265
7266sub resetterm {    # We forked, so we need a different TTY
7267
7268    # Needs to be passed to create_IN_OUT() as well.
7269    my $in = shift;
7270
7271    # resetterm(2): got in here because of a system() starting a debugger.
7272    # resetterm(1): just forked.
7273    my $systemed = $in > 1 ? '-' : '';
7274
7275    # If there's already a list of pids, add this to the end.
7276    if ($pids) {
7277        $pids =~ s/\]/$systemed->$$]/;
7278    }
7279
7280    # No pid list. Time to make one.
7281    else {
7282        $pids = "[$term_pid->$$]";
7283    }
7284
7285    # The prompt we're going to be using for this debugger.
7286    $pidprompt = $pids;
7287
7288    # We now 0wnz this terminal.
7289    $term_pid = $$;
7290
7291    # Just return if we're not supposed to try to create a new TTY.
7292    return unless $CreateTTY & $in;
7293
7294    # Try to create a new IN/OUT pair.
7295    create_IN_OUT($in);
7296} ## end sub resetterm
7297
7298=head2 C<readline>
7299
7300First, we handle stuff in the typeahead buffer. If there is any, we shift off
7301the next line, print a message saying we got it, add it to the terminal
7302history (if possible), and return it.
7303
7304If there's nothing in the typeahead buffer, check the command filehandle stack.
7305If there are any filehandles there, read from the last one, and return the line
7306if we got one. If not, we pop the filehandle off and close it, and try the
7307next one up the stack.
7308
7309If we've emptied the filehandle stack, we check to see if we've got a socket
7310open, and we read that and return it if we do. If we don't, we just call the
7311core C<readline()> and return its value.
7312
7313=cut
7314
7315sub readline {
7316
7317    # Localize to prevent it from being smashed in the program being debugged.
7318    local $.;
7319
7320    # If there are stacked filehandles to read from ...
7321    # (Handle it before the typeahead, because we may call source/etc. from
7322    # the typeahead.)
7323    while (@cmdfhs) {
7324
7325        # Read from the last one in the stack.
7326        my $line = CORE::readline( $cmdfhs[-1] );
7327
7328        # If we got a line ...
7329        defined $line
7330          ? ( print $OUT ">> $line" and return $line )    # Echo and return
7331          : close pop @cmdfhs;                            # Pop and close
7332    } ## end while (@cmdfhs)
7333
7334    # Pull a line out of the typeahead if there's stuff there.
7335    if (@typeahead) {
7336
7337        # How many lines left.
7338        my $left = @typeahead;
7339
7340        # Get the next line.
7341        my $got = shift @typeahead;
7342
7343        # Print a message saying we got input from the typeahead.
7344        local $\ = '';
7345        print $OUT "auto(-$left)", shift, $got, "\n";
7346
7347        # Add it to the terminal history (if possible).
7348        $term->AddHistory($got)
7349          if length($got) > 1
7350          and defined $term->Features->{addHistory};
7351        return $got;
7352    } ## end if (@typeahead)
7353
7354    # We really need to read some input. Turn off entry/exit trace and
7355    # return value printing.
7356    local $frame = 0;
7357    local $doret = -2;
7358
7359    # Nothing on the filehandle stack. Socket?
7360    if ( ref $OUT and UNIVERSAL::isa( $OUT, 'IO::Socket::INET' ) ) {
7361
7362        # Send anything we have to send.
7363        $OUT->write( join( '', @_ ) );
7364
7365        # Receive anything there is to receive.
7366        my $stuff = '';
7367        my $buf;
7368        my $first_time = 1;
7369
7370        while ($first_time or (length($buf) && ($stuff .= $buf) !~ /\n/))
7371        {
7372            $first_time = 0;
7373            $IN->recv( $buf = '', 2048 );   # XXX "what's wrong with sysread?"
7374                                            # XXX Don't know. You tell me.
7375        }
7376
7377        # What we got.
7378        return $stuff;
7379    } ## end if (ref $OUT and UNIVERSAL::isa...
7380
7381    # No socket. Just read from the terminal.
7382    else {
7383        return $term->readline(@_);
7384    }
7385} ## end sub readline
7386
7387=head1 OPTIONS SUPPORT ROUTINES
7388
7389These routines handle listing and setting option values.
7390
7391=head2 C<dump_option> - list the current value of an option setting
7392
7393This routine uses C<option_val> to look up the value for an option.
7394It cleans up escaped single-quotes and then displays the option and
7395its value.
7396
7397=cut
7398
7399sub dump_option {
7400    my ( $opt, $val ) = @_;
7401    $val = option_val( $opt, 'N/A' );
7402    $val =~ s/([\\\'])/\\$1/g;
7403    printf $OUT "%20s = '%s'\n", $opt, $val;
7404} ## end sub dump_option
7405
7406sub options2remember {
7407    foreach my $k (@RememberOnROptions) {
7408        $option{$k} = option_val( $k, 'N/A' );
7409    }
7410    return %option;
7411}
7412
7413=head2 C<option_val> - find the current value of an option
7414
7415This can't just be a simple hash lookup because of the indirect way that
7416the option values are stored. Some are retrieved by calling a subroutine,
7417some are just variables.
7418
7419You must supply a default value to be used in case the option isn't set.
7420
7421=cut
7422
7423sub option_val {
7424    my ( $opt, $default ) = @_;
7425    my $val;
7426
7427    # Does this option exist, and is it a variable?
7428    # If so, retrieve the value via the value in %optionVars.
7429    if (    defined $optionVars{$opt}
7430        and defined ${ $optionVars{$opt} } )
7431    {
7432        $val = ${ $optionVars{$opt} };
7433    }
7434
7435    # Does this option exist, and it's a subroutine?
7436    # If so, call the subroutine via the ref in %optionAction
7437    # and capture the value.
7438    elsif ( defined $optionAction{$opt}
7439        and defined &{ $optionAction{$opt} } )
7440    {
7441        $val = &{ $optionAction{$opt} }();
7442    }
7443
7444    # If there's an action or variable for the supplied option,
7445    # but no value was set, use the default.
7446    elsif (defined $optionAction{$opt} and not defined $option{$opt}
7447        or defined $optionVars{$opt} and not defined ${ $optionVars{$opt} } )
7448    {
7449        $val = $default;
7450    }
7451
7452    # Otherwise, do the simple hash lookup.
7453    else {
7454        $val = $option{$opt};
7455    }
7456
7457    # If the value isn't defined, use the default.
7458    # Then return whatever the value is.
7459    $val = $default unless defined $val;
7460    $val;
7461} ## end sub option_val
7462
7463=head2 C<parse_options>
7464
7465Handles the parsing and execution of option setting/displaying commands.
7466
7467An option entered by itself is assumed to be I<set me to 1> (the default value)
7468if the option is a boolean one. If not, the user is prompted to enter a valid
7469value or to query the current value (via C<option? >).
7470
7471If C<option=value> is entered, we try to extract a quoted string from the
7472value (if it is quoted). If it's not, we just use the whole value as-is.
7473
7474We load any modules required to service this option, and then we set it: if
7475it just gets stuck in a variable, we do that; if there's a subroutine to
7476handle setting the option, we call that.
7477
7478Finally, if we're running in interactive mode, we display the effect of the
7479user's command back to the terminal, skipping this if we're setting things
7480during initialization.
7481
7482=cut
7483
7484sub parse_options {
7485    my ($s) = @_;
7486    local $\ = '';
7487
7488    my $option;
7489
7490    # These options need a value. Don't allow them to be clobbered by accident.
7491    my %opt_needs_val = map { ( $_ => 1 ) } qw{
7492      dumpDepth arrayDepth hashDepth LineInfo maxTraceLen ornaments windowSize
7493      pager quote ReadLine recallCommand RemotePort ShellBang TTY CommandSet
7494    };
7495
7496    while (length($s)) {
7497        my $val_defaulted;
7498
7499        # Clean off excess leading whitespace.
7500        $s =~ s/^\s+// && next;
7501
7502        # Options are always all word characters, followed by a non-word
7503        # separator.
7504        if ($s !~ s/^(\w+)(\W?)//) {
7505            print {$OUT} "Invalid option '$s'\n";
7506            last;
7507        }
7508        my ( $opt, $sep ) = ( $1, $2 );
7509
7510        # Make sure that such an option exists.
7511        my $matches = ( grep { /^\Q$opt/ && ( $option = $_ ) } @options )
7512          || ( grep { /^\Q$opt/i && ( $option = $_ ) } @options );
7513
7514        unless ($matches) {
7515            print {$OUT} "Unknown option '$opt'\n";
7516            next;
7517        }
7518        if ($matches > 1) {
7519            print {$OUT} "Ambiguous option '$opt'\n";
7520            next;
7521        }
7522        my $val;
7523
7524        # '?' as separator means query, but must have whitespace after it.
7525        if ( "?" eq $sep ) {
7526            if ($s =~ /\A\S/) {
7527                print {$OUT} "Option query '$opt?' followed by non-space '$s'\n" ;
7528
7529                last;
7530            }
7531
7532            #&dump_option($opt);
7533        } ## end if ("?" eq $sep)
7534
7535        # Separator is whitespace (or just a carriage return).
7536        # They're going for a default, which we assume is 1.
7537        elsif ( $sep !~ /\S/ ) {
7538            $val_defaulted = 1;
7539            $val           = "1";   #  this is an evil default; make 'em set it!
7540        }
7541
7542        # Separator is =. Trying to set a value.
7543        elsif ( $sep eq "=" ) {
7544
7545            # If quoted, extract a quoted string.
7546            if ($s =~ s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x) {
7547                my $quote = $1;
7548                ( $val = $2 ) =~ s/\\([$quote\\])/$1/g;
7549            }
7550
7551            # Not quoted. Use the whole thing. Warn about 'option='.
7552            else {
7553                $s =~ s/^(\S*)//;
7554                $val = $1;
7555                print OUT qq(Option better cleared using $opt=""\n)
7556                  unless length $val;
7557            } ## end else [ if (s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x)
7558
7559        } ## end elsif ($sep eq "=")
7560
7561        # "Quoted" with [], <>, or {}.
7562        else {    #{ to "let some poor schmuck bounce on the % key in B<vi>."
7563            my ($end) =
7564              "\\" . substr( ")]>}$sep", index( "([<{", $sep ), 1 );    #}
7565            $s =~ s/^(([^\\$end]|\\[\\$end])*)$end($|\s+)//
7566              or print( $OUT "Unclosed option value '$opt$sep$_'\n" ), last;
7567            ( $val = $1 ) =~ s/\\([\\$end])/$1/g;
7568        } ## end else [ if ("?" eq $sep)
7569
7570        # Exclude non-booleans from getting set to 1 by default.
7571        if ( $opt_needs_val{$option} && $val_defaulted ) {
7572            my $cmd = ( $CommandSet eq '580' ) ? 'o' : 'O';
7573            print {$OUT}
7574"Option '$opt' is non-boolean.  Use '$cmd $option=VAL' to set, '$cmd $option?' to query\n";
7575            next;
7576        } ## end if ($opt_needs_val{$option...
7577
7578        # Save the option value.
7579        $option{$option} = $val if defined $val;
7580
7581        # Load any module that this option requires.
7582        if ( defined($optionRequire{$option}) && defined($val) ) {
7583            eval qq{
7584            local \$frame = 0;
7585            local \$doret = -2;
7586            require '$optionRequire{$option}';
7587            1;
7588            } || die $@   # XXX: shouldn't happen
7589        }
7590
7591        # Set it.
7592        # Stick it in the proper variable if it goes in a variable.
7593        if (defined($optionVars{$option}) && defined($val)) {
7594            ${ $optionVars{$option} } = $val;
7595        }
7596
7597        # Call the appropriate sub if it gets set via sub.
7598        if (defined($optionAction{$option})
7599          && defined (&{ $optionAction{$option} })
7600          && defined ($val))
7601        {
7602          &{ $optionAction{$option} }($val);
7603        }
7604
7605        # Not initialization - echo the value we set it to.
7606        dump_option($option) if ($OUT ne \*STDERR);
7607    } ## end while (length)
7608} ## end sub parse_options
7609
7610=head1 RESTART SUPPORT
7611
7612These routines are used to store (and restore) lists of items in environment
7613variables during a restart.
7614
7615=head2 set_list
7616
7617Set_list packages up items to be stored in a set of environment variables
7618(VAR_n, containing the number of items, and VAR_0, VAR_1, etc., containing
7619the values). Values outside the standard ASCII charset are stored by encoding
7620them as hexadecimal values.
7621
7622=cut
7623
7624sub set_list {
7625    my ( $stem, @list ) = @_;
7626    my $val;
7627
7628    # VAR_n: how many we have. Scalar assignment gets the number of items.
7629    $ENV{"${stem}_n"} = @list;
7630
7631    # Grab each item in the list, escape the backslashes, encode the non-ASCII
7632    # as hex, and then save in the appropriate VAR_0, VAR_1, etc.
7633    for my $i ( 0 .. $#list ) {
7634        $val = $list[$i];
7635        $val =~ s/\\/\\\\/g;
7636        no warnings 'experimental::regex_sets';
7637        $val =~ s/ ( (?[ [\000-\xFF] & [:^print:] ]) ) /
7638                                                "\\0x" . unpack('H2',$1)/xaeg;
7639        $ENV{"${stem}_$i"} = $val;
7640    } ## end for $i (0 .. $#list)
7641} ## end sub set_list
7642
7643=head2 get_list
7644
7645Reverse the set_list operation: grab VAR_n to see how many we should be getting
7646back, and then pull VAR_0, VAR_1. etc. back out.
7647
7648=cut
7649
7650sub get_list {
7651    my $stem = shift;
7652    my @list;
7653    my $n = delete $ENV{"${stem}_n"};
7654    my $val;
7655    for my $i ( 0 .. $n - 1 ) {
7656        $val = delete $ENV{"${stem}_$i"};
7657        $val =~ s/\\((\\)|0x(..))/ $2 ? $2 : pack('H2', $3) /ge;
7658        push @list, $val;
7659    }
7660    @list;
7661} ## end sub get_list
7662
7663=head1 MISCELLANEOUS SIGNAL AND I/O MANAGEMENT
7664
7665=head2 catch()
7666
7667The C<catch()> subroutine is the essence of fast and low-impact. We simply
7668set an already-existing global scalar variable to a constant value. This
7669avoids allocating any memory possibly in the middle of something that will
7670get all confused if we do, particularly under I<unsafe signals>.
7671
7672=cut
7673
7674sub catch {
7675    $signal = 1;
7676    return;    # Put nothing on the stack - malloc/free land!
7677}
7678
7679=head2 C<warn()>
7680
7681C<warn> emits a warning, by joining together its arguments and printing
7682them, with couple of fillips.
7683
7684If the composited message I<doesn't> end with a newline, we automatically
7685add C<$!> and a newline to the end of the message. The subroutine expects $OUT
7686to be set to the filehandle to be used to output warnings; it makes no
7687assumptions about what filehandles are available.
7688
7689=cut
7690
7691sub _db_warn {
7692    my ($msg) = join( "", @_ );
7693    $msg .= ": $!\n" unless $msg =~ /\n$/;
7694    local $\ = '';
7695    print $OUT $msg;
7696} ## end sub warn
7697
7698*warn = \&_db_warn;
7699
7700=head1 INITIALIZATION TTY SUPPORT
7701
7702=head2 C<reset_IN_OUT>
7703
7704This routine handles restoring the debugger's input and output filehandles
7705after we've tried and failed to move them elsewhere.  In addition, it assigns
7706the debugger's output filehandle to $LINEINFO if it was already open there.
7707
7708=cut
7709
7710sub reset_IN_OUT {
7711    my $switch_li = $LINEINFO eq $OUT;
7712
7713    # If there's a term and it's able to get a new tty, try to get one.
7714    if ( $term and $term->Features->{newTTY} ) {
7715        ( $IN, $OUT ) = ( shift, shift );
7716        $term->newTTY( $IN, $OUT );
7717    }
7718
7719    # This term can't get a new tty now. Better luck later.
7720    elsif ($term) {
7721        _db_warn("Too late to set IN/OUT filehandles, enabled on next 'R'!\n");
7722    }
7723
7724    # Set the filehndles up as they were.
7725    else {
7726        ( $IN, $OUT ) = ( shift, shift );
7727    }
7728
7729    # Unbuffer the output filehandle.
7730    _autoflush($OUT);
7731
7732    # Point LINEINFO to the same output filehandle if it was there before.
7733    $LINEINFO = $OUT if $switch_li;
7734} ## end sub reset_IN_OUT
7735
7736=head1 OPTION SUPPORT ROUTINES
7737
7738The following routines are used to process some of the more complicated
7739debugger options.
7740
7741=head2 C<TTY>
7742
7743Sets the input and output filehandles to the specified files or pipes.
7744If the terminal supports switching, we go ahead and do it. If not, and
7745there's already a terminal in place, we save the information to take effect
7746on restart.
7747
7748If there's no terminal yet (for instance, during debugger initialization),
7749we go ahead and set C<$console> and C<$tty> to the file indicated.
7750
7751=cut
7752
7753sub TTY {
7754
7755    if ( @_ and $term and $term->Features->{newTTY} ) {
7756
7757        # This terminal supports switching to a new TTY.
7758        # Can be a list of two files, or on string containing both names,
7759        # comma-separated.
7760        # XXX Should this perhaps be an assignment from @_?
7761        my ( $in, $out ) = shift;
7762        if ( $in =~ /,/ ) {
7763
7764            # Split list apart if supplied.
7765            ( $in, $out ) = split /,/, $in, 2;
7766        }
7767        else {
7768
7769            # Use the same file for both input and output.
7770            $out = $in;
7771        }
7772
7773        # Open file onto the debugger's filehandles, if you can.
7774        open IN,  '<', $in or die "cannot open '$in' for read: $!";
7775        open OUT, '>', $out or die "cannot open '$out' for write: $!";
7776
7777        # Swap to the new filehandles.
7778        reset_IN_OUT( \*IN, \*OUT );
7779
7780        # Save the setting for later.
7781        return $tty = $in;
7782    } ## end if (@_ and $term and $term...
7783
7784    # Terminal doesn't support new TTY, or doesn't support readline.
7785    # Can't do it now, try restarting.
7786    if ($term and @_) {
7787        _db_warn("Too late to set TTY, enabled on next 'R'!\n");
7788    }
7789
7790    # Useful if done through PERLDB_OPTS:
7791    $console = $tty = shift if @_;
7792
7793    # Return whatever the TTY is.
7794    $tty or $console;
7795} ## end sub TTY
7796
7797=head2 C<noTTY>
7798
7799Sets the C<$notty> global, controlling whether or not the debugger tries to
7800get a terminal to read from. If called after a terminal is already in place,
7801we save the value to use it if we're restarted.
7802
7803=cut
7804
7805sub noTTY {
7806    if ($term) {
7807        _db_warn("Too late to set noTTY, enabled on next 'R'!\n") if @_;
7808    }
7809    $notty = shift if @_;
7810    $notty;
7811} ## end sub noTTY
7812
7813=head2 C<ReadLine>
7814
7815Sets the C<$rl> option variable. If 0, we use C<Term::ReadLine::Stub>
7816(essentially, no C<readline> processing on this I<terminal>). Otherwise, we
7817use C<Term::ReadLine>. Can't be changed after a terminal's in place; we save
7818the value in case a restart is done so we can change it then.
7819
7820=cut
7821
7822sub ReadLine {
7823    if ($term) {
7824        _db_warn("Too late to set ReadLine, enabled on next 'R'!\n") if @_;
7825    }
7826    $rl = shift if @_;
7827    $rl;
7828} ## end sub ReadLine
7829
7830=head2 C<RemotePort>
7831
7832Sets the port that the debugger will try to connect to when starting up.
7833If the terminal's already been set up, we can't do it, but we remember the
7834setting in case the user does a restart.
7835
7836=cut
7837
7838sub RemotePort {
7839    if ($term) {
7840        _db_warn("Too late to set RemotePort, enabled on next 'R'!\n") if @_;
7841    }
7842    $remoteport = shift if @_;
7843    $remoteport;
7844} ## end sub RemotePort
7845
7846=head2 C<tkRunning>
7847
7848Checks with the terminal to see if C<Tk> is running, and returns true or
7849false. Returns false if the current terminal doesn't support C<readline>.
7850
7851=cut
7852
7853sub tkRunning {
7854    if ( ${ $term->Features }{tkRunning} ) {
7855        return $term->tkRunning(@_);
7856    }
7857    else {
7858        local $\ = '';
7859        print $OUT "tkRunning not supported by current ReadLine package.\n";
7860        0;
7861    }
7862} ## end sub tkRunning
7863
7864=head2 C<NonStop>
7865
7866Sets nonstop mode. If a terminal's already been set up, it's too late; the
7867debugger remembers the setting in case you restart, though.
7868
7869=cut
7870
7871sub NonStop {
7872    if ($term) {
7873        _db_warn("Too late to set up NonStop mode, enabled on next 'R'!\n")
7874          if @_;
7875    }
7876    $runnonstop = shift if @_;
7877    $runnonstop;
7878} ## end sub NonStop
7879
7880sub DollarCaretP {
7881    if ($term) {
7882        _db_warn("Some flag changes could not take effect until next 'R'!\n")
7883          if @_;
7884    }
7885    $^P = parse_DollarCaretP_flags(shift) if @_;
7886    expand_DollarCaretP_flags($^P);
7887}
7888
7889=head2 C<pager>
7890
7891Set up the C<$pager> variable. Adds a pipe to the front unless there's one
7892there already.
7893
7894=cut
7895
7896sub pager {
7897    if (@_) {
7898        $pager = shift;
7899        $pager = "|" . $pager unless $pager =~ /^(\+?\>|\|)/;
7900    }
7901    $pager;
7902} ## end sub pager
7903
7904=head2 C<shellBang>
7905
7906Sets the shell escape command, and generates a printable copy to be used
7907in the help.
7908
7909=cut
7910
7911sub shellBang {
7912
7913    # If we got an argument, meta-quote it, and add '\b' if it
7914    # ends in a word character.
7915    if (@_) {
7916        $sh = quotemeta shift;
7917        $sh .= "\\b" if $sh =~ /\w$/;
7918    }
7919
7920    # Generate the printable version for the help:
7921    $psh = $sh;    # copy it
7922    $psh =~ s/\\b$//;        # Take off trailing \b if any
7923    $psh =~ s/\\(.)/$1/g;    # De-escape
7924    $psh;                    # return the printable version
7925} ## end sub shellBang
7926
7927=head2 C<ornaments>
7928
7929If the terminal has its own ornaments, fetch them. Otherwise accept whatever
7930was passed as the argument. (This means you can't override the terminal's
7931ornaments.)
7932
7933=cut
7934
7935sub ornaments {
7936    if ( defined $term ) {
7937
7938        # We don't want to show warning backtraces, but we do want die() ones.
7939        local $warnLevel = 0;
7940        local $dieLevel = 1;
7941
7942        # No ornaments if the terminal doesn't support them.
7943        if (not $term->Features->{ornaments}) {
7944            return '';
7945        }
7946
7947        return (eval { $term->ornaments(@_) } || '');
7948    }
7949
7950    # Use what was passed in if we can't determine it ourselves.
7951    else {
7952        $ornaments = shift;
7953
7954        return $ornaments;
7955    }
7956
7957} ## end sub ornaments
7958
7959=head2 C<recallCommand>
7960
7961Sets the recall command, and builds a printable version which will appear in
7962the help text.
7963
7964=cut
7965
7966sub recallCommand {
7967
7968    # If there is input, metaquote it. Add '\b' if it ends with a word
7969    # character.
7970    if (@_) {
7971        $rc = quotemeta shift;
7972        $rc .= "\\b" if $rc =~ /\w$/;
7973    }
7974
7975    # Build it into a printable version.
7976    $prc = $rc;              # Copy it
7977    $prc =~ s/\\b$//;        # Remove trailing \b
7978    $prc =~ s/\\(.)/$1/g;    # Remove escapes
7979    return $prc;             # Return the printable version
7980} ## end sub recallCommand
7981
7982=head2 C<LineInfo> - where the line number information goes
7983
7984Called with no arguments, returns the file or pipe that line info should go to.
7985
7986Called with an argument (a file or a pipe), it opens that onto the
7987C<LINEINFO> filehandle, unbuffers the filehandle, and then returns the
7988file or pipe again to the caller.
7989
7990=cut
7991
7992sub LineInfo {
7993    if (@_) {
7994        $lineinfo = shift;
7995
7996        #  If this is a valid "thing to be opened for output", tack a
7997        # '>' onto the front.
7998        my $stream = ( $lineinfo =~ /^(\+?\>|\|)/ ) ? $lineinfo : ">$lineinfo";
7999
8000        # If this is a pipe, the stream points to a slave editor.
8001        $slave_editor = ( $stream =~ /^\|/ );
8002
8003        my $new_lineinfo_fh;
8004        # Open it up and unbuffer it.
8005        open ($new_lineinfo_fh , $stream )
8006            or _db_warn("Cannot open '$stream' for write");
8007        $LINEINFO = $new_lineinfo_fh;
8008        _autoflush($LINEINFO);
8009    }
8010
8011    return $lineinfo;
8012} ## end sub LineInfo
8013
8014=head1 COMMAND SUPPORT ROUTINES
8015
8016These subroutines provide functionality for various commands.
8017
8018=head2 C<list_modules>
8019
8020For the C<M> command: list modules loaded and their versions.
8021Essentially just runs through the keys in %INC, picks each package's
8022C<$VERSION> variable, gets the file name, and formats the information
8023for output.
8024
8025=cut
8026
8027sub list_modules {    # versions
8028    my %version;
8029    my $file;
8030
8031    # keys are the "as-loaded" name, values are the fully-qualified path
8032    # to the file itself.
8033    for ( keys %INC ) {
8034        $file = $_;                                # get the module name
8035        s,\.p[lm]$,,i;                             # remove '.pl' or '.pm'
8036        s,/,::,g;                                  # change '/' to '::'
8037        s/^perl5db$/DB/;                           # Special case: debugger
8038                                                   # moves to package DB
8039        s/^Term::ReadLine::readline$/readline/;    # simplify readline
8040
8041        # If the package has a $VERSION package global (as all good packages
8042        # should!) decode it and save as partial message.
8043        my $pkg_version = do { no strict 'refs'; ${ $_ . '::VERSION' } };
8044        if ( defined $pkg_version ) {
8045            $version{$file} = "$pkg_version from ";
8046        }
8047
8048        # Finish up the message with the file the package came from.
8049        $version{$file} .= $INC{$file};
8050    } ## end for (keys %INC)
8051
8052    # Hey, dumpit() formats a hash nicely, so why not use it?
8053    dumpit( $OUT, \%version );
8054} ## end sub list_modules
8055
8056=head2 C<sethelp()>
8057
8058Sets up the monster string used to format and print the help.
8059
8060=head3 HELP MESSAGE FORMAT
8061
8062The help message is a peculiar format unto itself; it mixes C<pod> I<ornaments>
8063(C<< B<> >> C<< I<> >>) with tabs to come up with a format that's fairly
8064easy to parse and portable, but which still allows the help to be a little
8065nicer than just plain text.
8066
8067Essentially, you define the command name (usually marked up with C<< B<> >>
8068and C<< I<> >>), followed by a tab, and then the descriptive text, ending in a
8069newline. The descriptive text can also be marked up in the same way. If you
8070need to continue the descriptive text to another line, start that line with
8071just tabs and then enter the marked-up text.
8072
8073If you are modifying the help text, I<be careful>. The help-string parser is
8074not very sophisticated, and if you don't follow these rules it will mangle the
8075help beyond hope until you fix the string.
8076
8077=cut
8078
8079use vars qw($pre580_help);
8080use vars qw($pre580_summary);
8081
8082sub sethelp {
8083
8084    # XXX: make sure there are tabs between the command and explanation,
8085    #      or print_help will screw up your formatting if you have
8086    #      eeevil ornaments enabled.  This is an insane mess.
8087
8088    $help = "
8089Help is currently only available for the new 5.8 command set.
8090No help is available for the old command set.
8091We assume you know what you're doing if you switch to it.
8092
8093B<T>        Stack trace.
8094B<s> [I<expr>]    Single step [in I<expr>].
8095B<n> [I<expr>]    Next, steps over subroutine calls [in I<expr>].
8096<B<CR>>        Repeat last B<n> or B<s> command.
8097B<r>        Return from current subroutine.
8098B<c> [I<line>|I<sub>]    Continue; optionally inserts a one-time-only breakpoint
8099        at the specified position.
8100B<l> I<min>B<+>I<incr>    List I<incr>+1 lines starting at I<min>.
8101B<l> I<min>B<->I<max>    List lines I<min> through I<max>.
8102B<l> I<line>        List single I<line>.
8103B<l> I<subname>    List first window of lines from subroutine.
8104B<l> I<\$var>        List first window of lines from subroutine referenced by I<\$var>.
8105B<l>        List next window of lines.
8106B<->        List previous window of lines.
8107B<v> [I<line>]    View window around I<line>.
8108B<.>        Return to the executed line.
8109B<f> I<filename>    Switch to viewing I<filename>. File must be already loaded.
8110        I<filename> may be either the full name of the file, or a regular
8111        expression matching the full file name:
8112        B<f> I</home/me/foo.pl> and B<f> I<oo\\.> may access the same file.
8113        Evals (with saved bodies) are considered to be filenames:
8114        B<f> I<(eval 7)> and B<f> I<eval 7\\b> access the body of the 7th eval
8115        (in the order of execution).
8116B</>I<pattern>B</>    Search forwards for I<pattern>; final B</> is optional.
8117B<?>I<pattern>B<?>    Search backwards for I<pattern>; final B<?> is optional.
8118B<L> [I<a|b|w>]        List actions and or breakpoints and or watch-expressions.
8119B<S> [[B<!>]I<pattern>]    List subroutine names [not] matching I<pattern>.
8120B<t> [I<n>]       Toggle trace mode (to max I<n> levels below current stack depth).
8121B<t> [I<n>] I<expr>        Trace through execution of I<expr>.
8122B<b>        Sets breakpoint on current line)
8123B<b> [I<line>] [I<condition>]
8124        Set breakpoint; I<line> defaults to the current execution line;
8125        I<condition> breaks if it evaluates to true, defaults to '1'.
8126B<b> I<subname> [I<condition>]
8127        Set breakpoint at first line of subroutine.
8128B<b> I<\$var>        Set breakpoint at first line of subroutine referenced by I<\$var>.
8129B<b> B<load> I<filename> Set breakpoint on 'require'ing the given file.
8130B<b> B<postpone> I<subname> [I<condition>]
8131        Set breakpoint at first line of subroutine after
8132        it is compiled.
8133B<b> B<compile> I<subname>
8134        Stop after the subroutine is compiled.
8135B<B> [I<line>]    Delete the breakpoint for I<line>.
8136B<B> I<*>             Delete all breakpoints.
8137B<a> [I<line>] I<command>
8138        Set an action to be done before the I<line> is executed;
8139        I<line> defaults to the current execution line.
8140        Sequence is: check for breakpoint/watchpoint, print line
8141        if necessary, do action, prompt user if necessary,
8142        execute line.
8143B<a>        Does nothing
8144B<A> [I<line>]    Delete the action for I<line>.
8145B<A> I<*>             Delete all actions.
8146B<w> I<expr>        Add a global watch-expression.
8147B<w>             Does nothing
8148B<W> I<expr>        Delete a global watch-expression.
8149B<W> I<*>             Delete all watch-expressions.
8150B<V> [I<pkg> [I<vars>]]    List some (default all) variables in package (default current).
8151        Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps.
8152B<X> [I<vars>]    Same as \"B<V> I<currentpackage> [I<vars>]\".
8153B<x> I<expr>        Evals expression in list context, dumps the result.
8154B<m> I<expr>        Evals expression in list context, prints methods callable
8155        on the first element of the result.
8156B<m> I<class>        Prints methods callable via the given class.
8157B<M>        Show versions of loaded modules.
8158B<i> I<class>       Prints nested parents of given class.
8159B<e>         Display current thread id.
8160B<E>         Display all thread ids the current one will be identified: <n>.
8161B<y> [I<n> [I<Vars>]]   List lexicals in higher scope <n>.  Vars same as B<V>.
8162
8163B<<> ?            List Perl commands to run before each prompt.
8164B<<> I<expr>        Define Perl command to run before each prompt.
8165B<<<> I<expr>        Add to the list of Perl commands to run before each prompt.
8166B<< *>                Delete the list of perl commands to run before each prompt.
8167B<>> ?            List Perl commands to run after each prompt.
8168B<>> I<expr>        Define Perl command to run after each prompt.
8169B<>>B<>> I<expr>        Add to the list of Perl commands to run after each prompt.
8170B<>>B< *>        Delete the list of Perl commands to run after each prompt.
8171B<{> I<db_command>    Define debugger command to run before each prompt.
8172B<{> ?            List debugger commands to run before each prompt.
8173B<{{> I<db_command>    Add to the list of debugger commands to run before each prompt.
8174B<{ *>             Delete the list of debugger commands to run before each prompt.
8175B<$prc> I<number>    Redo a previous command (default previous command).
8176B<$prc> I<-number>    Redo number'th-to-last command.
8177B<$prc> I<pattern>    Redo last command that started with I<pattern>.
8178        See 'B<O> I<recallCommand>' too.
8179B<$psh$psh> I<cmd>      Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)"
8180      . (
8181        $rc eq $sh
8182        ? ""
8183        : "
8184B<$psh> [I<cmd>] Run I<cmd> in subshell (forces \"\$SHELL -c 'cmd'\")."
8185      ) . "
8186        See 'B<O> I<shellBang>' too.
8187B<source> I<file>     Execute I<file> containing debugger commands (may nest).
8188B<save> I<file>       Save current debugger session (actual history) to I<file>.
8189B<rerun>           Rerun session to current position.
8190B<rerun> I<n>         Rerun session to numbered command.
8191B<rerun> I<-n>        Rerun session to number'th-to-last command.
8192B<H> I<-number>    Display last number commands (default all).
8193B<H> I<*>          Delete complete history.
8194B<p> I<expr>        Same as \"I<print {DB::OUT} expr>\" in current package.
8195B<|>I<dbcmd>        Run debugger command, piping DB::OUT to current pager.
8196B<||>I<dbcmd>        Same as B<|>I<dbcmd> but DB::OUT is temporarily select()ed as well.
8197B<\=> [I<alias> I<value>]    Define a command alias, or list current aliases.
8198I<command>        Execute as a perl statement in current package.
8199B<R>        Pure-man-restart of debugger, some of debugger state
8200        and command-line options may be lost.
8201        Currently the following settings are preserved:
8202        history, breakpoints and actions, debugger B<O>ptions
8203        and the following command-line options: I<-w>, I<-I>, I<-e>.
8204
8205B<o> [I<opt>] ...    Set boolean option to true
8206B<o> [I<opt>B<?>]    Query options
8207B<o> [I<opt>B<=>I<val>] [I<opt>=B<\">I<val>B<\">] ...
8208        Set options.  Use quotes if spaces in value.
8209    I<recallCommand>, I<ShellBang>    chars used to recall command or spawn shell;
8210    I<pager>            program for output of \"|cmd\";
8211    I<tkRunning>            run Tk while prompting (with ReadLine);
8212    I<signalLevel> I<warnLevel> I<dieLevel>    level of verbosity;
8213    I<inhibit_exit>        Allows stepping off the end of the script.
8214    I<ImmediateStop>        Debugger should stop as early as possible.
8215    I<RemotePort>            Remote hostname:port for remote debugging
8216  The following options affect what happens with B<V>, B<X>, and B<x> commands:
8217    I<arrayDepth>, I<hashDepth>     print only first N elements ('' for all);
8218    I<compactDump>, I<veryCompact>     change style of array and hash dump;
8219    I<globPrint>             whether to print contents of globs;
8220    I<DumpDBFiles>         dump arrays holding debugged files;
8221    I<DumpPackages>         dump symbol tables of packages;
8222    I<DumpReused>             dump contents of \"reused\" addresses;
8223    I<quote>, I<HighBit>, I<undefPrint>     change style of string dump;
8224    I<bareStringify>         Do not print the overload-stringified value;
8225  Other options include:
8226    I<PrintRet>        affects printing of return value after B<r> command,
8227    I<frame>        affects printing messages on subroutine entry/exit.
8228    I<AutoTrace>    affects printing messages on possible breaking points.
8229    I<maxTraceLen>    gives max length of evals/args listed in stack trace.
8230    I<ornaments>     affects screen appearance of the command line.
8231    I<CreateTTY>     bits control attempts to create a new TTY on events:
8232            1: on fork()    2: debugger is started inside debugger
8233            4: on startup
8234    During startup options are initialized from \$ENV{PERLDB_OPTS}.
8235    You can put additional initialization options I<TTY>, I<noTTY>,
8236    I<ReadLine>, I<NonStop>, and I<RemotePort> there (or use
8237    B<R> after you set them).
8238
8239B<q> or B<^D>        Quit. Set B<\$DB::finished = 0> to debug global destruction.
8240B<h>        Summary of debugger commands.
8241B<h> [I<db_command>]    Get help [on a specific debugger command], enter B<|h> to page.
8242B<h h>        Long help for debugger commands
8243B<$doccmd> I<manpage>    Runs the external doc viewer B<$doccmd> command on the
8244        named Perl I<manpage>, or on B<$doccmd> itself if omitted.
8245        Set B<\$DB::doccmd> to change viewer.
8246
8247Type '|h h' for a paged display if this was too hard to read.
8248
8249";    # Fix balance of vi % matching: }}}}
8250
8251    #  note: tabs in the following section are not-so-helpful
8252    $summary = <<"END_SUM";
8253I<List/search source lines:>               I<Control script execution:>
8254  B<l> [I<ln>|I<sub>]  List source code            B<T>           Stack trace
8255  B<-> or B<.>      List previous/current line  B<s> [I<expr>]    Single step [in expr]
8256  B<v> [I<line>]    View around line            B<n> [I<expr>]    Next, steps over subs
8257  B<f> I<filename>  View source in file         <B<CR>/B<Enter>>  Repeat last B<n> or B<s>
8258  B</>I<pattern>B</> B<?>I<patt>B<?>   Search forw/backw    B<r>           Return from subroutine
8259  B<M>           Show module versions        B<c> [I<ln>|I<sub>]  Continue until position
8260I<Debugger controls:>                        B<L>           List break/watch/actions
8261  B<o> [...]     Set debugger options        B<t> [I<n>] [I<expr>] Toggle trace [max depth] ][trace expr]
8262  B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
8263  B<$prc> [I<N>|I<pat>]   Redo a previous command     B<B> I<ln|*>      Delete a/all breakpoints
8264  B<H> [I<-num>]    Display last num commands   B<a> [I<ln>] I<cmd>  Do cmd before line
8265  B<=> [I<a> I<val>]   Define/list an alias        B<A> I<ln|*>      Delete a/all actions
8266  B<h> [I<db_cmd>]  Get help on command         B<w> I<expr>      Add a watch expression
8267  B<h h>         Complete help page          B<W> I<expr|*>    Delete a/all watch exprs
8268  B<|>[B<|>]I<db_cmd>  Send output to pager        B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess
8269  B<q> or B<^D>     Quit                        B<R>           Attempt a restart
8270I<Data Examination:>     B<expr>     Execute perl code, also see: B<s>,B<n>,B<t> I<expr>
8271  B<x>|B<m> I<expr>       Evals expr in list context, dumps the result or lists methods.
8272  B<p> I<expr>         Print expression (uses script's current package).
8273  B<S> [[B<!>]I<pat>]     List subroutine names [not] matching pattern
8274  B<V> [I<Pk> [I<Vars>]]  List Variables in Package.  Vars can be ~pattern or !pattern.
8275  B<X> [I<Vars>]       Same as \"B<V> I<current_package> [I<Vars>]\".  B<i> I<class> inheritance tree.
8276  B<y> [I<n> [I<Vars>]]   List lexicals in higher scope <n>.  Vars same as B<V>.
8277  B<e>     Display thread id     B<E> Display all thread ids.
8278For more help, type B<h> I<cmd_letter>, or run B<$doccmd perldebug> for all docs.
8279END_SUM
8280
8281    # ')}}; # Fix balance of vi % matching
8282
8283    # and this is really numb...
8284    $pre580_help = "
8285B<T>        Stack trace.
8286B<s> [I<expr>]    Single step [in I<expr>].
8287B<n> [I<expr>]    Next, steps over subroutine calls [in I<expr>].
8288B<CR>>        Repeat last B<n> or B<s> command.
8289B<r>        Return from current subroutine.
8290B<c> [I<line>|I<sub>]    Continue; optionally inserts a one-time-only breakpoint
8291        at the specified position.
8292B<l> I<min>B<+>I<incr>    List I<incr>+1 lines starting at I<min>.
8293B<l> I<min>B<->I<max>    List lines I<min> through I<max>.
8294B<l> I<line>        List single I<line>.
8295B<l> I<subname>    List first window of lines from subroutine.
8296B<l> I<\$var>        List first window of lines from subroutine referenced by I<\$var>.
8297B<l>        List next window of lines.
8298B<->        List previous window of lines.
8299B<w> [I<line>]    List window around I<line>.
8300B<.>        Return to the executed line.
8301B<f> I<filename>    Switch to viewing I<filename>. File must be already loaded.
8302        I<filename> may be either the full name of the file, or a regular
8303        expression matching the full file name:
8304        B<f> I</home/me/foo.pl> and B<f> I<oo\\.> may access the same file.
8305        Evals (with saved bodies) are considered to be filenames:
8306        B<f> I<(eval 7)> and B<f> I<eval 7\\b> access the body of the 7th eval
8307        (in the order of execution).
8308B</>I<pattern>B</>    Search forwards for I<pattern>; final B</> is optional.
8309B<?>I<pattern>B<?>    Search backwards for I<pattern>; final B<?> is optional.
8310B<L>        List all breakpoints and actions.
8311B<S> [[B<!>]I<pattern>]    List subroutine names [not] matching I<pattern>.
8312B<t> [I<n>]       Toggle trace mode (to max I<n> levels below current stack depth) .
8313B<t> [I<n>] I<expr>        Trace through execution of I<expr>.
8314B<b> [I<line>] [I<condition>]
8315        Set breakpoint; I<line> defaults to the current execution line;
8316        I<condition> breaks if it evaluates to true, defaults to '1'.
8317B<b> I<subname> [I<condition>]
8318        Set breakpoint at first line of subroutine.
8319B<b> I<\$var>        Set breakpoint at first line of subroutine referenced by I<\$var>.
8320B<b> B<load> I<filename> Set breakpoint on 'require'ing the given file.
8321B<b> B<postpone> I<subname> [I<condition>]
8322        Set breakpoint at first line of subroutine after
8323        it is compiled.
8324B<b> B<compile> I<subname>
8325        Stop after the subroutine is compiled.
8326B<d> [I<line>]    Delete the breakpoint for I<line>.
8327B<D>        Delete all breakpoints.
8328B<a> [I<line>] I<command>
8329        Set an action to be done before the I<line> is executed;
8330        I<line> defaults to the current execution line.
8331        Sequence is: check for breakpoint/watchpoint, print line
8332        if necessary, do action, prompt user if necessary,
8333        execute line.
8334B<a> [I<line>]    Delete the action for I<line>.
8335B<A>        Delete all actions.
8336B<W> I<expr>        Add a global watch-expression.
8337B<W>        Delete all watch-expressions.
8338B<V> [I<pkg> [I<vars>]]    List some (default all) variables in package (default current).
8339        Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps.
8340B<X> [I<vars>]    Same as \"B<V> I<currentpackage> [I<vars>]\".
8341B<x> I<expr>        Evals expression in list context, dumps the result.
8342B<m> I<expr>        Evals expression in list context, prints methods callable
8343        on the first element of the result.
8344B<m> I<class>        Prints methods callable via the given class.
8345
8346B<<> ?            List Perl commands to run before each prompt.
8347B<<> I<expr>        Define Perl command to run before each prompt.
8348B<<<> I<expr>        Add to the list of Perl commands to run before each prompt.
8349B<>> ?            List Perl commands to run after each prompt.
8350B<>> I<expr>        Define Perl command to run after each prompt.
8351B<>>B<>> I<expr>        Add to the list of Perl commands to run after each prompt.
8352B<{> I<db_command>    Define debugger command to run before each prompt.
8353B<{> ?            List debugger commands to run before each prompt.
8354B<{{> I<db_command>    Add to the list of debugger commands to run before each prompt.
8355B<$prc> I<number>    Redo a previous command (default previous command).
8356B<$prc> I<-number>    Redo number'th-to-last command.
8357B<$prc> I<pattern>    Redo last command that started with I<pattern>.
8358        See 'B<O> I<recallCommand>' too.
8359B<$psh$psh> I<cmd>      Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)"
8360      . (
8361        $rc eq $sh
8362        ? ""
8363        : "
8364B<$psh> [I<cmd>]     Run I<cmd> in subshell (forces \"\$SHELL -c 'cmd'\")."
8365      ) . "
8366        See 'B<O> I<shellBang>' too.
8367B<source> I<file>        Execute I<file> containing debugger commands (may nest).
8368B<H> I<-number>    Display last number commands (default all).
8369B<p> I<expr>        Same as \"I<print {DB::OUT} expr>\" in current package.
8370B<|>I<dbcmd>        Run debugger command, piping DB::OUT to current pager.
8371B<||>I<dbcmd>        Same as B<|>I<dbcmd> but DB::OUT is temporarilly select()ed as well.
8372B<\=> [I<alias> I<value>]    Define a command alias, or list current aliases.
8373I<command>        Execute as a perl statement in current package.
8374B<v>        Show versions of loaded modules.
8375B<R>        Pure-man-restart of debugger, some of debugger state
8376        and command-line options may be lost.
8377        Currently the following settings are preserved:
8378        history, breakpoints and actions, debugger B<O>ptions
8379        and the following command-line options: I<-w>, I<-I>, I<-e>.
8380
8381B<O> [I<opt>] ...    Set boolean option to true
8382B<O> [I<opt>B<?>]    Query options
8383B<O> [I<opt>B<=>I<val>] [I<opt>=B<\">I<val>B<\">] ...
8384        Set options.  Use quotes if spaces in value.
8385    I<recallCommand>, I<ShellBang>    chars used to recall command or spawn shell;
8386    I<pager>            program for output of \"|cmd\";
8387    I<tkRunning>            run Tk while prompting (with ReadLine);
8388    I<signalLevel> I<warnLevel> I<dieLevel>    level of verbosity;
8389    I<inhibit_exit>        Allows stepping off the end of the script.
8390    I<ImmediateStop>        Debugger should stop as early as possible.
8391    I<RemotePort>            Remote hostname:port for remote debugging
8392  The following options affect what happens with B<V>, B<X>, and B<x> commands:
8393    I<arrayDepth>, I<hashDepth>     print only first N elements ('' for all);
8394    I<compactDump>, I<veryCompact>     change style of array and hash dump;
8395    I<globPrint>             whether to print contents of globs;
8396    I<DumpDBFiles>         dump arrays holding debugged files;
8397    I<DumpPackages>         dump symbol tables of packages;
8398    I<DumpReused>             dump contents of \"reused\" addresses;
8399    I<quote>, I<HighBit>, I<undefPrint>     change style of string dump;
8400    I<bareStringify>         Do not print the overload-stringified value;
8401  Other options include:
8402    I<PrintRet>        affects printing of return value after B<r> command,
8403    I<frame>        affects printing messages on subroutine entry/exit.
8404    I<AutoTrace>    affects printing messages on possible breaking points.
8405    I<maxTraceLen>    gives max length of evals/args listed in stack trace.
8406    I<ornaments>     affects screen appearance of the command line.
8407    I<CreateTTY>     bits control attempts to create a new TTY on events:
8408            1: on fork()    2: debugger is started inside debugger
8409            4: on startup
8410    During startup options are initialized from \$ENV{PERLDB_OPTS}.
8411    You can put additional initialization options I<TTY>, I<noTTY>,
8412    I<ReadLine>, I<NonStop>, and I<RemotePort> there (or use
8413    B<R> after you set them).
8414
8415B<q> or B<^D>        Quit. Set B<\$DB::finished = 0> to debug global destruction.
8416B<h> [I<db_command>]    Get help [on a specific debugger command], enter B<|h> to page.
8417B<h h>        Summary of debugger commands.
8418B<$doccmd> I<manpage>    Runs the external doc viewer B<$doccmd> command on the
8419        named Perl I<manpage>, or on B<$doccmd> itself if omitted.
8420        Set B<\$DB::doccmd> to change viewer.
8421
8422Type '|h' for a paged display if this was too hard to read.
8423
8424";    # Fix balance of vi % matching: }}}}
8425
8426    #  note: tabs in the following section are not-so-helpful
8427    $pre580_summary = <<"END_SUM";
8428I<List/search source lines:>               I<Control script execution:>
8429  B<l> [I<ln>|I<sub>]  List source code            B<T>           Stack trace
8430  B<-> or B<.>      List previous/current line  B<s> [I<expr>]    Single step [in expr]
8431  B<w> [I<line>]    List around line            B<n> [I<expr>]    Next, steps over subs
8432  B<f> I<filename>  View source in file         <B<CR>/B<Enter>>  Repeat last B<n> or B<s>
8433  B</>I<pattern>B</> B<?>I<patt>B<?>   Search forw/backw    B<r>           Return from subroutine
8434  B<v>           Show versions of modules    B<c> [I<ln>|I<sub>]  Continue until position
8435I<Debugger controls:>                        B<L>           List break/watch/actions
8436  B<O> [...]     Set debugger options        B<t> [I<expr>]    Toggle trace [trace expr]
8437  B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
8438  B<$prc> [I<N>|I<pat>]   Redo a previous command     B<d> [I<ln>] or B<D> Delete a/all breakpoints
8439  B<H> [I<-num>]    Display last num commands   B<a> [I<ln>] I<cmd>  Do cmd before line
8440  B<=> [I<a> I<val>]   Define/list an alias        B<W> I<expr>      Add a watch expression
8441  B<h> [I<db_cmd>]  Get help on command         B<A> or B<W>      Delete all actions/watch
8442  B<|>[B<|>]I<db_cmd>  Send output to pager        B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess
8443  B<q> or B<^D>     Quit                        B<R>           Attempt a restart
8444I<Data Examination:>     B<expr>     Execute perl code, also see: B<s>,B<n>,B<t> I<expr>
8445  B<x>|B<m> I<expr>       Evals expr in list context, dumps the result or lists methods.
8446  B<p> I<expr>         Print expression (uses script's current package).
8447  B<S> [[B<!>]I<pat>]     List subroutine names [not] matching pattern
8448  B<V> [I<Pk> [I<Vars>]]  List Variables in Package.  Vars can be ~pattern or !pattern.
8449  B<X> [I<Vars>]       Same as \"B<V> I<current_package> [I<Vars>]\".
8450  B<y> [I<n> [I<Vars>]]   List lexicals in higher scope <n>.  Vars same as B<V>.
8451For more help, type B<h> I<cmd_letter>, or run B<$doccmd perldebug> for all docs.
8452END_SUM
8453
8454    # ')}}; # Fix balance of vi % matching
8455
8456} ## end sub sethelp
8457
8458=head2 C<print_help()>
8459
8460Most of what C<print_help> does is just text formatting. It finds the
8461C<B> and C<I> ornaments, cleans them off, and substitutes the proper
8462terminal control characters to simulate them (courtesy of
8463C<Term::ReadLine::TermCap>).
8464
8465=cut
8466
8467sub print_help {
8468    my $help_str = shift;
8469
8470    # Restore proper alignment destroyed by eeevil I<> and B<>
8471    # ornaments: A pox on both their houses!
8472    #
8473    # A help command will have everything up to and including
8474    # the first tab sequence padded into a field 16 (or if indented 20)
8475    # wide.  If it's wider than that, an extra space will be added.
8476    $help_str =~ s{
8477        ^                       # only matters at start of line
8478          ( \ {4} | \t )*       # some subcommands are indented
8479          ( < ?                 # so <CR> works
8480            [BI] < [^\t\n] + )  # find an eeevil ornament
8481          ( \t+ )               # original separation, discarded
8482          ( .* )                # this will now start (no earlier) than
8483                                # column 16
8484    } {
8485        my($leadwhite, $command, $midwhite, $text) = ($1, $2, $3, $4);
8486        my $clean = $command;
8487        $clean =~ s/[BI]<([^>]*)>/$1/g;
8488
8489        # replace with this whole string:
8490        ($leadwhite ? " " x 4 : "")
8491      . $command
8492      . ((" " x (16 + ($leadwhite ? 4 : 0) - length($clean))) || " ")
8493      . $text;
8494
8495    }mgex;
8496
8497    $help_str =~ s{                          # handle bold ornaments
8498       B < ( [^>] + | > ) >
8499    } {
8500          $Term::ReadLine::TermCap::rl_term_set[2]
8501        . $1
8502        . $Term::ReadLine::TermCap::rl_term_set[3]
8503    }gex;
8504
8505    $help_str =~ s{                         # handle italic ornaments
8506       I < ( [^>] + | > ) >
8507    } {
8508          $Term::ReadLine::TermCap::rl_term_set[0]
8509        . $1
8510        . $Term::ReadLine::TermCap::rl_term_set[1]
8511    }gex;
8512
8513    local $\ = '';
8514    print {$OUT} $help_str;
8515
8516    return;
8517} ## end sub print_help
8518
8519=head2 C<fix_less>
8520
8521This routine does a lot of gyrations to be sure that the pager is C<less>.
8522It checks for C<less> masquerading as C<more> and records the result in
8523C<$fixed_less> so we don't have to go through doing the stats again.
8524
8525=cut
8526
8527use vars qw($fixed_less);
8528
8529sub _calc_is_less {
8530    if ($pager =~ /\bless\b/)
8531    {
8532        return 1;
8533    }
8534    elsif ($pager =~ /\bmore\b/)
8535    {
8536        # Nope, set to more. See what's out there.
8537        my @st_more = stat('/usr/bin/more');
8538        my @st_less = stat('/usr/bin/less');
8539
8540        # is it really less, pretending to be more?
8541        return (
8542            @st_more
8543            && @st_less
8544            && $st_more[0] == $st_less[0]
8545            && $st_more[1] == $st_less[1]
8546        );
8547    }
8548    else {
8549        return;
8550    }
8551}
8552
8553sub fix_less {
8554
8555    # We already know if this is set.
8556    return if $fixed_less;
8557
8558    # changes environment!
8559    # 'r' added so we don't do (slow) stats again.
8560    $fixed_less = 1 if _calc_is_less();
8561
8562    return;
8563} ## end sub fix_less
8564
8565=head1 DIE AND WARN MANAGEMENT
8566
8567=head2 C<diesignal>
8568
8569C<diesignal> is a just-drop-dead C<die> handler. It's most useful when trying
8570to debug a debugger problem.
8571
8572It does its best to report the error that occurred, and then forces the
8573program, debugger, and everything to die.
8574
8575=cut
8576
8577sub diesignal {
8578
8579    # No entry/exit messages.
8580    local $frame = 0;
8581
8582    # No return value prints.
8583    local $doret = -2;
8584
8585    # set the abort signal handling to the default (just terminate).
8586    $SIG{'ABRT'} = 'DEFAULT';
8587
8588    # If we enter the signal handler recursively, kill myself with an
8589    # abort signal (so we just terminate).
8590    kill 'ABRT', $$ if $panic++;
8591
8592    # If we can show detailed info, do so.
8593    if ( defined &Carp::longmess ) {
8594
8595        # Don't recursively enter the warn handler, since we're carping.
8596        local $SIG{__WARN__} = '';
8597
8598        # Skip two levels before reporting traceback: we're skipping
8599        # mydie and confess.
8600        local $Carp::CarpLevel = 2;    # mydie + confess
8601
8602        # Tell us all about it.
8603        _db_warn( Carp::longmess("Signal @_") );
8604    }
8605
8606    # No Carp. Tell us about the signal as best we can.
8607    else {
8608        local $\ = '';
8609        print $DB::OUT "Got signal @_\n";
8610    }
8611
8612    # Drop dead.
8613    kill 'ABRT', $$;
8614} ## end sub diesignal
8615
8616=head2 C<dbwarn>
8617
8618The debugger's own default C<$SIG{__WARN__}> handler. We load C<Carp> to
8619be able to get a stack trace, and output the warning message vi C<DB::dbwarn()>.
8620
8621=cut
8622
8623sub dbwarn {
8624
8625    # No entry/exit trace.
8626    local $frame = 0;
8627
8628    # No return value printing.
8629    local $doret = -2;
8630
8631    # Turn off warn and die handling to prevent recursive entries to this
8632    # routine.
8633    local $SIG{__WARN__} = '';
8634    local $SIG{__DIE__}  = '';
8635
8636    # Load Carp if we can. If $^S is false (current thing being compiled isn't
8637    # done yet), we may not be able to do a require.
8638    eval { require Carp }
8639      if defined $^S;    # If error/warning during compilation,
8640                         # require may be broken.
8641
8642    # Use the core warn() unless Carp loaded OK.
8643    CORE::warn( @_,
8644        "\nCannot print stack trace, load with -MCarp option to see stack" ),
8645      return
8646      unless defined &Carp::longmess;
8647
8648    # Save the current values of $single and $trace, and then turn them off.
8649    my ( $mysingle, $mytrace ) = ( $single, $trace );
8650    $single = 0;
8651    $trace  = 0;
8652
8653    # We can call Carp::longmess without its being "debugged" (which we
8654    # don't want - we just want to use it!). Capture this for later.
8655    my $mess = Carp::longmess(@_);
8656
8657    # Restore $single and $trace to their original values.
8658    ( $single, $trace ) = ( $mysingle, $mytrace );
8659
8660    # Use the debugger's own special way of printing warnings to print
8661    # the stack trace message.
8662    _db_warn($mess);
8663} ## end sub dbwarn
8664
8665=head2 C<dbdie>
8666
8667The debugger's own C<$SIG{__DIE__}> handler. Handles providing a stack trace
8668by loading C<Carp> and calling C<Carp::longmess()> to get it. We turn off
8669single stepping and tracing during the call to C<Carp::longmess> to avoid
8670debugging it - we just want to use it.
8671
8672If C<dieLevel> is zero, we let the program being debugged handle the
8673exceptions. If it's 1, you get backtraces for any exception. If it's 2,
8674the debugger takes over all exception handling, printing a backtrace and
8675displaying the exception via its C<dbwarn()> routine.
8676
8677=cut
8678
8679sub dbdie {
8680    local $frame         = 0;
8681    local $doret         = -2;
8682    local $SIG{__DIE__}  = '';
8683    local $SIG{__WARN__} = '';
8684    if ( $dieLevel > 2 ) {
8685        local $SIG{__WARN__} = \&dbwarn;
8686        _db_warn(@_);    # Yell no matter what
8687        return;
8688    }
8689    if ( $dieLevel < 2 ) {
8690        die @_ if $^S;    # in eval propagate
8691    }
8692
8693    # The code used to check $^S to see if compilation of the current thing
8694    # hadn't finished. We don't do it anymore, figuring eval is pretty stable.
8695    eval { require Carp };
8696
8697    die( @_,
8698        "\nCannot print stack trace, load with -MCarp option to see stack" )
8699      unless defined &Carp::longmess;
8700
8701    # We do not want to debug this chunk (automatic disabling works
8702    # inside DB::DB, but not in Carp). Save $single and $trace, turn them off,
8703    # get the stack trace from Carp::longmess (if possible), restore $signal
8704    # and $trace, and then die with the stack trace.
8705    my ( $mysingle, $mytrace ) = ( $single, $trace );
8706    $single = 0;
8707    $trace  = 0;
8708    my $mess = "@_";
8709    {
8710
8711        package Carp;    # Do not include us in the list
8712        eval { $mess = Carp::longmess(@_); };
8713    }
8714    ( $single, $trace ) = ( $mysingle, $mytrace );
8715    die $mess;
8716} ## end sub dbdie
8717
8718=head2 C<warnlevel()>
8719
8720Set the C<$DB::warnLevel> variable that stores the value of the
8721C<warnLevel> option. Calling C<warnLevel()> with a positive value
8722results in the debugger taking over all warning handlers. Setting
8723C<warnLevel> to zero leaves any warning handlers set up by the program
8724being debugged in place.
8725
8726=cut
8727
8728sub warnLevel {
8729    if (@_) {
8730        my $prevwarn = $SIG{__WARN__} unless $warnLevel;
8731        $warnLevel = shift;
8732        if ($warnLevel) {
8733            $SIG{__WARN__} = \&DB::dbwarn;
8734        }
8735        elsif ($prevwarn) {
8736            $SIG{__WARN__} = $prevwarn;
8737        } else {
8738            undef $SIG{__WARN__};
8739        }
8740    } ## end if (@_)
8741    $warnLevel;
8742} ## end sub warnLevel
8743
8744=head2 C<dielevel>
8745
8746Similar to C<warnLevel>. Non-zero values for C<dieLevel> result in the
8747C<DB::dbdie()> function overriding any other C<die()> handler. Setting it to
8748zero lets you use your own C<die()> handler.
8749
8750=cut
8751
8752sub dieLevel {
8753    local $\ = '';
8754    if (@_) {
8755        my $prevdie = $SIG{__DIE__} unless $dieLevel;
8756        $dieLevel = shift;
8757        if ($dieLevel) {
8758
8759            # Always set it to dbdie() for non-zero values.
8760            $SIG{__DIE__} = \&DB::dbdie;    # if $dieLevel < 2;
8761
8762            # No longer exists, so don't try  to use it.
8763            #$SIG{__DIE__} = \&DB::diehard if $dieLevel >= 2;
8764
8765            # If we've finished initialization, mention that stack dumps
8766            # are enabled, If dieLevel is 1, we won't stack dump if we die
8767            # in an eval().
8768            print $OUT "Stack dump during die enabled",
8769              ( $dieLevel == 1 ? " outside of evals" : "" ), ".\n"
8770              if $I_m_init;
8771
8772            # XXX This is probably obsolete, given that diehard() is gone.
8773            print $OUT "Dump printed too.\n" if $dieLevel > 2;
8774        } ## end if ($dieLevel)
8775
8776        # Put the old one back if there was one.
8777        elsif ($prevdie) {
8778            $SIG{__DIE__} = $prevdie;
8779            print $OUT "Default die handler restored.\n";
8780        } else {
8781            undef $SIG{__DIE__};
8782            print $OUT "Die handler removed.\n";
8783        }
8784    } ## end if (@_)
8785    $dieLevel;
8786} ## end sub dieLevel
8787
8788=head2 C<signalLevel>
8789
8790Number three in a series: set C<signalLevel> to zero to keep your own
8791signal handler for C<SIGSEGV> and/or C<SIGBUS>. Otherwise, the debugger
8792takes over and handles them with C<DB::diesignal()>.
8793
8794=cut
8795
8796sub signalLevel {
8797    if (@_) {
8798        my $prevsegv = $SIG{SEGV} unless $signalLevel;
8799        my $prevbus  = $SIG{BUS}  unless $signalLevel;
8800        $signalLevel = shift;
8801        if ($signalLevel) {
8802            $SIG{SEGV} = \&DB::diesignal;
8803            $SIG{BUS}  = \&DB::diesignal;
8804        }
8805        else {
8806            $SIG{SEGV} = $prevsegv;
8807            $SIG{BUS}  = $prevbus;
8808        }
8809    } ## end if (@_)
8810    $signalLevel;
8811} ## end sub signalLevel
8812
8813=head1 SUBROUTINE DECODING SUPPORT
8814
8815These subroutines are used during the C<x> and C<X> commands to try to
8816produce as much information as possible about a code reference. They use
8817L<Devel::Peek> to try to find the glob in which this code reference lives
8818(if it does) - this allows us to actually code references which correspond
8819to named subroutines (including those aliased via glob assignment).
8820
8821=head2 C<CvGV_name()>
8822
8823Wrapper for C<CvGV_name_or_bust>; tries to get the name of a reference
8824via that routine. If this fails, return the reference again (when the
8825reference is stringified, it'll come out as C<SOMETHING(0x...)>).
8826
8827=cut
8828
8829sub CvGV_name {
8830    my $in   = shift;
8831    my $name = CvGV_name_or_bust($in);
8832    defined $name ? $name : $in;
8833}
8834
8835=head2 C<CvGV_name_or_bust> I<coderef>
8836
8837Calls L<Devel::Peek> to try to find the glob the ref lives in; returns
8838C<undef> if L<Devel::Peek> can't be loaded, or if C<Devel::Peek::CvGV> can't
8839find a glob for this ref.
8840
8841Returns C<< I<package>::I<glob name> >> if the code ref is found in a glob.
8842
8843=cut
8844
8845use vars qw($skipCvGV);
8846
8847sub CvGV_name_or_bust {
8848    my $in = shift;
8849    return if $skipCvGV;    # Backdoor to avoid problems if XS broken...
8850    return unless ref $in;
8851    $in = \&$in;            # Hard reference...
8852    eval { _DB__use__full_path(sub { require Devel::Peek; 1;}); } or return;
8853    my $gv = Devel::Peek::CvGV($in) or return;
8854    *$gv{PACKAGE} . '::' . *$gv{NAME};
8855} ## end sub CvGV_name_or_bust
8856
8857=head2 C<find_sub>
8858
8859A utility routine used in various places; finds the file where a subroutine
8860was defined, and returns that filename and a line-number range.
8861
8862Tries to use C<@sub> first; if it can't find it there, it tries building a
8863reference to the subroutine and uses C<CvGV_name_or_bust> to locate it,
8864loading it into C<@sub> as a side effect (XXX I think). If it can't find it
8865this way, it brute-force searches C<%sub>, checking for identical references.
8866
8867=cut
8868
8869sub _find_sub_helper {
8870    my $subr = shift;
8871
8872    return unless defined &$subr;
8873    my $name = CvGV_name_or_bust($subr);
8874    my $data;
8875    $data = $sub{$name} if defined $name;
8876    return $data if defined $data;
8877
8878    # Old stupid way...
8879    $subr = \&$subr;    # Hard reference
8880    my $s;
8881    for ( keys %sub ) {
8882        $s = $_, last if $subr eq \&$_;
8883    }
8884    if ($s)
8885    {
8886        return $sub{$s};
8887    }
8888    else
8889    {
8890        return;
8891    }
8892
8893}
8894
8895sub find_sub {
8896    my $subr = shift;
8897    return ( $sub{$subr} || _find_sub_helper($subr) );
8898} ## end sub find_sub
8899
8900=head2 C<methods>
8901
8902A subroutine that uses the utility function C<methods_via> to find all the
8903methods in the class corresponding to the current reference and in
8904C<UNIVERSAL>.
8905
8906=cut
8907
8908use vars qw(%seen);
8909
8910sub methods {
8911
8912    # Figure out the class - either this is the class or it's a reference
8913    # to something blessed into that class.
8914    my $class = shift;
8915    $class = ref $class if ref $class;
8916
8917    local %seen;
8918
8919    # Show the methods that this class has.
8920    methods_via( $class, '', 1 );
8921
8922    # Show the methods that UNIVERSAL has.
8923    methods_via( 'UNIVERSAL', 'UNIVERSAL', 0 );
8924} ## end sub methods
8925
8926=head2 C<methods_via($class, $prefix, $crawl_upward)>
8927
8928C<methods_via> does the work of crawling up the C<@ISA> tree and reporting
8929all the parent class methods. C<$class> is the name of the next class to
8930try; C<$prefix> is the message prefix, which gets built up as we go up the
8931C<@ISA> tree to show parentage; C<$crawl_upward> is 1 if we should try to go
8932higher in the C<@ISA> tree, 0 if we should stop.
8933
8934=cut
8935
8936sub methods_via {
8937
8938    # If we've processed this class already, just quit.
8939    my $class = shift;
8940    return if $seen{$class}++;
8941
8942    # This is a package that is contributing the methods we're about to print.
8943    my $prefix  = shift;
8944    my $prepend = $prefix ? "via $prefix: " : '';
8945    my @to_print;
8946
8947    # Extract from all the symbols in this class.
8948    my $class_ref = do { no strict "refs"; \%{$class . '::'} };
8949    while (my ($name, $glob) = each %$class_ref) {
8950        # references directly in the symbol table are Proxy Constant
8951        # Subroutines, and are by their very nature defined
8952        # Otherwise, check if the thing is a typeglob, and if it is, it decays
8953        # to a subroutine reference, which can be tested by defined.
8954        # $glob might also be the value -1  (from sub foo;)
8955        # or (say) '$$' (from sub foo ($$);)
8956        # \$glob will be SCALAR in both cases.
8957        if ((ref $glob || ($glob && ref \$glob eq 'GLOB' && defined &$glob))
8958            && !$seen{$name}++) {
8959            push @to_print, "$prepend$name\n";
8960        }
8961    }
8962
8963    {
8964        local $\ = '';
8965        local $, = '';
8966        print $DB::OUT $_ foreach sort @to_print;
8967    }
8968
8969    # If the $crawl_upward argument is false, just quit here.
8970    return unless shift;
8971
8972    # $crawl_upward true: keep going up the tree.
8973    # Find all the classes this one is a subclass of.
8974    my $class_ISA_ref = do { no strict "refs"; \@{"${class}::ISA"} };
8975    for my $name ( @$class_ISA_ref ) {
8976
8977        # Set up the new prefix.
8978        $prepend = $prefix ? $prefix . " -> $name" : $name;
8979
8980        # Crawl up the tree and keep trying to crawl up.
8981        methods_via( $name, $prepend, 1 );
8982    }
8983} ## end sub methods_via
8984
8985=head2 C<setman> - figure out which command to use to show documentation
8986
8987Just checks the contents of C<$^O> and sets the C<$doccmd> global accordingly.
8988
8989=cut
8990
8991sub setman {
8992    $doccmd = $^O !~ /^(?:MSWin32|VMS|os2|dos|amigaos|riscos|NetWare)\z/s
8993      ? "man"         # O Happy Day!
8994      : "perldoc";    # Alas, poor unfortunates
8995} ## end sub setman
8996
8997=head2 C<runman> - run the appropriate command to show documentation
8998
8999Accepts a man page name; runs the appropriate command to display it (set up
9000during debugger initialization). Uses C<_db_system()> to avoid mucking up the
9001program's STDIN and STDOUT.
9002
9003=cut
9004
9005sub runman {
9006    my $page = shift;
9007    unless ($page) {
9008        _db_system("$doccmd $doccmd");
9009        return;
9010    }
9011
9012    # this way user can override, like with $doccmd="man -Mwhatever"
9013    # or even just "man " to disable the path check.
9014    if ( $doccmd ne 'man' ) {
9015        _db_system("$doccmd $page");
9016        return;
9017    }
9018
9019    $page = 'perl' if lc($page) eq 'help';
9020
9021    require Config;
9022    my $man1dir = $Config::Config{man1direxp};
9023    my $man3dir = $Config::Config{man3direxp};
9024    for ( $man1dir, $man3dir ) { s#/[^/]*\z## if /\S/ }
9025    my $manpath = '';
9026    $manpath .= "$man1dir:" if $man1dir =~ /\S/;
9027    $manpath .= "$man3dir:" if $man3dir =~ /\S/ && $man1dir ne $man3dir;
9028    chop $manpath if $manpath;
9029
9030    # harmless if missing, I figure
9031    local $ENV{MANPATH} = $manpath if $manpath;
9032    my $nopathopt = $^O =~ /dunno what goes here/;
9033    if (
9034        CORE::system(
9035            $doccmd,
9036
9037            # I just *know* there are men without -M
9038            ( ( $manpath && !$nopathopt ) ? ( "-M", $manpath ) : () ),
9039            split ' ', $page
9040        )
9041      )
9042    {
9043        unless ( $page =~ /^perl\w/ ) {
9044            # Previously the debugger contained a list which it slurped in,
9045            # listing the known "perl" manpages. However, it was out of date,
9046            # with errors both of omission and inclusion. This approach is
9047            # considerably less complex. The failure mode on a butchered
9048            # install is simply that the user has to run man or perldoc
9049            # "manually" with the full manpage name.
9050
9051            # There is a list of $^O values in installperl to determine whether
9052            # the directory is 'pods' or 'pod'. However, we can avoid tight
9053            # coupling to that by simply checking the "non-standard" 'pods'
9054            # first.
9055            my $pods = "$Config::Config{privlibexp}/pods";
9056            $pods = "$Config::Config{privlibexp}/pod"
9057                unless -d $pods;
9058            if (-f "$pods/perl$page.pod") {
9059                CORE::system( $doccmd,
9060                    ( ( $manpath && !$nopathopt ) ? ( "-M", $manpath ) : () ),
9061                    "perl$page" );
9062            }
9063        }
9064    } ## end if (CORE::system($doccmd...
9065} ## end sub runman
9066
9067#use Carp;                          # This did break, left for debugging
9068
9069=head1 DEBUGGER INITIALIZATION - THE SECOND BEGIN BLOCK
9070
9071Because of the way the debugger interface to the Perl core is designed, any
9072debugger package globals that C<DB::sub()> requires have to be defined before
9073any subroutines can be called. These are defined in the second C<BEGIN> block.
9074
9075This block sets things up so that (basically) the world is sane
9076before the debugger starts executing. We set up various variables that the
9077debugger has to have set up before the Perl core starts running:
9078
9079=over 4
9080
9081=item *
9082
9083The debugger's own filehandles (copies of STD and STDOUT for now).
9084
9085=item *
9086
9087Characters for shell escapes, the recall command, and the history command.
9088
9089=item *
9090
9091The maximum recursion depth.
9092
9093=item *
9094
9095The size of a C<w> command's window.
9096
9097=item *
9098
9099The before-this-line context to be printed in a C<v> (view a window around this line) command.
9100
9101=item *
9102
9103The fact that we're not in a sub at all right now.
9104
9105=item *
9106
9107The default SIGINT handler for the debugger.
9108
9109=item *
9110
9111The appropriate value of the flag in C<$^D> that says the debugger is running
9112
9113=item *
9114
9115The current debugger recursion level
9116
9117=item *
9118
9119The list of postponed items and the C<$single> stack (XXX define this)
9120
9121=item *
9122
9123That we want no return values and no subroutine entry/exit trace.
9124
9125=back
9126
9127=cut
9128
9129# The following BEGIN is very handy if debugger goes havoc, debugging debugger?
9130
9131use vars qw($db_stop);
9132
9133BEGIN {    # This does not compile, alas. (XXX eh?)
9134    $IN  = \*STDIN;     # For bugs before DB::OUT has been opened
9135    $OUT = \*STDERR;    # For errors before DB::OUT has been opened
9136
9137    # Define characters used by command parsing.
9138    $sh       = '!';      # Shell escape (does not work)
9139    $rc       = ',';      # Recall command (does not work)
9140    @hist     = ('?');    # Show history (does not work)
9141    @truehist = ();       # Can be saved for replay (per session)
9142
9143    # This defines the point at which you get the 'deep recursion'
9144    # warning. It MUST be defined or the debugger will not load.
9145    $deep = 1000;
9146
9147    # Number of lines around the current one that are shown in the
9148    # 'w' command.
9149    $window = 10;
9150
9151    # How much before-the-current-line context the 'v' command should
9152    # use in calculating the start of the window it will display.
9153    $preview = 3;
9154
9155    # We're not in any sub yet, but we need this to be a defined value.
9156    $sub = '';
9157
9158    # Set up the debugger's interrupt handler. It simply sets a flag
9159    # ($signal) that DB::DB() will check before each command is executed.
9160    $SIG{INT} = \&DB::catch;
9161
9162    # The following lines supposedly, if uncommented, allow the debugger to
9163    # debug itself. Perhaps we can try that someday.
9164    # This may be enabled to debug debugger:
9165    #$warnLevel = 1 unless defined $warnLevel;
9166    #$dieLevel = 1 unless defined $dieLevel;
9167    #$signalLevel = 1 unless defined $signalLevel;
9168
9169    # This is the flag that says "a debugger is running, please call
9170    # DB::DB and DB::sub". We will turn it on forcibly before we try to
9171    # execute anything in the user's context, because we always want to
9172    # get control back.
9173    $db_stop = 0;          # Compiler warning ...
9174    $db_stop = 1 << 30;    # ... because this is only used in an eval() later.
9175
9176    # This variable records how many levels we're nested in debugging.
9177    # Used in the debugger prompt, and in determining whether it's all over or
9178    # not.
9179    $level = 0;            # Level of recursive debugging
9180
9181    # "Triggers bug (?) in perl if we postpone this until runtime."
9182    # XXX No details on this yet, or whether we should fix the bug instead
9183    # of work around it. Stay tuned.
9184    @stack = (0);
9185
9186    # Used to track the current stack depth using the auto-stacked-variable
9187    # trick.
9188    $stack_depth = 0;      # Localized repeatedly; simple way to track $#stack
9189
9190    # Don't print return values on exiting a subroutine.
9191    $doret = -2;
9192
9193    # No extry/exit tracing.
9194    $frame = 0;
9195
9196} ## end BEGIN
9197
9198BEGIN { $^W = $ini_warn; }    # Switch warnings back
9199
9200=head1 READLINE SUPPORT - COMPLETION FUNCTION
9201
9202=head2 db_complete
9203
9204C<readline> support - adds command completion to basic C<readline>.
9205
9206Returns a list of possible completions to C<readline> when invoked. C<readline>
9207will print the longest common substring following the text already entered.
9208
9209If there is only a single possible completion, C<readline> will use it in full.
9210
9211This code uses C<map> and C<grep> heavily to create lists of possible
9212completion. Think LISP in this section.
9213
9214=cut
9215
9216sub db_complete {
9217
9218    # Specific code for b c l V m f O, &blah, $blah, @blah, %blah
9219    # $text is the text to be completed.
9220    # $line is the incoming line typed by the user.
9221    # $start is the start of the text to be completed in the incoming line.
9222    my ( $text, $line, $start ) = @_;
9223
9224    # Save the initial text.
9225    # The search pattern is current package, ::, extract the next qualifier
9226    # Prefix and pack are set to undef.
9227    my ( $itext, $search, $prefix, $pack ) =
9228      ( $text, "^\Q${package}::\E([^:]+)\$" );
9229
9230=head3 C<b postpone|compile>
9231
9232=over 4
9233
9234=item *
9235
9236Find all the subroutines that might match in this package
9237
9238=item *
9239
9240Add C<postpone>, C<load>, and C<compile> as possibles (we may be completing the keyword itself)
9241
9242=item *
9243
9244Include all the rest of the subs that are known
9245
9246=item *
9247
9248C<grep> out the ones that match the text we have so far
9249
9250=item *
9251
9252Return this as the list of possible completions
9253
9254=back
9255
9256=cut
9257
9258    return sort grep /^\Q$text/, ( keys %sub ),
9259      qw(postpone load compile),    # subroutines
9260      ( map { /$search/ ? ($1) : () } keys %sub )
9261      if ( substr $line, 0, $start ) =~ /^\|*[blc]\s+((postpone|compile)\s+)?$/;
9262
9263=head3 C<b load>
9264
9265Get all the possible files from C<@INC> as it currently stands and
9266select the ones that match the text so far.
9267
9268=cut
9269
9270    return sort grep /^\Q$text/, values %INC    # files
9271      if ( substr $line, 0, $start ) =~ /^\|*b\s+load\s+$/;
9272
9273=head3  C<V> (list variable) and C<m> (list modules)
9274
9275There are two entry points for these commands:
9276
9277=head4 Unqualified package names
9278
9279Get the top-level packages and grab everything that matches the text
9280so far. For each match, recursively complete the partial packages to
9281get all possible matching packages. Return this sorted list.
9282
9283=cut
9284
9285    return sort map { ( $_, db_complete( $_ . "::", "V ", 2 ) ) }
9286      grep /^\Q$text/, map { /^(.*)::$/ ? ($1) : () } keys %::    # top-packages
9287      if ( substr $line, 0, $start ) =~ /^\|*[Vm]\s+$/ and $text =~ /^\w*$/;
9288
9289=head4 Qualified package names
9290
9291Take a partially-qualified package and find all subpackages for it
9292by getting all the subpackages for the package so far, matching all
9293the subpackages against the text, and discarding all of them which
9294start with 'main::'. Return this list.
9295
9296=cut
9297
9298    return sort map { ( $_, db_complete( $_ . "::", "V ", 2 ) ) }
9299      grep !/^main::/, grep /^\Q$text/,
9300      map { /^(.*)::$/ ? ( $prefix . "::$1" ) : () }
9301      do { no strict 'refs'; keys %{ $prefix . '::' } }
9302      if ( substr $line, 0, $start ) =~ /^\|*[Vm]\s+$/
9303      and $text =~ /^(.*[^:])::?(\w*)$/
9304      and $prefix = $1;
9305
9306=head3 C<f> - switch files
9307
9308Here, we want to get a fully-qualified filename for the C<f> command.
9309Possibilities are:
9310
9311=over 4
9312
9313=item 1. The original source file itself
9314
9315=item 2. A file from C<@INC>
9316
9317=item 3. An C<eval> (the debugger gets a C<(eval N)> fake file for each C<eval>).
9318
9319=back
9320
9321=cut
9322
9323    if ( $line =~ /^\|*f\s+(.*)/ ) {    # Loaded files
9324           # We might possibly want to switch to an eval (which has a "filename"
9325           # like '(eval 9)'), so we may need to clean up the completion text
9326           # before proceeding.
9327        $prefix = length($1) - length($text);
9328        $text   = $1;
9329
9330=pod
9331
9332Under the debugger, source files are represented as C<_E<lt>/fullpath/to/file>
9333(C<eval>s are C<_E<lt>(eval NNN)>) keys in C<%main::>. We pull all of these
9334out of C<%main::>, add the initial source file, and extract the ones that
9335match the completion text so far.
9336
9337=cut
9338
9339        return sort
9340          map { substr $_, 2 + $prefix } grep /^_<\Q$text/, ( keys %main:: ),
9341          $0;
9342    } ## end if ($line =~ /^\|*f\s+(.*)/)
9343
9344=head3 Subroutine name completion
9345
9346We look through all of the defined subs (the keys of C<%sub>) and
9347return both all the possible matches to the subroutine name plus
9348all the matches qualified to the current package.
9349
9350=cut
9351
9352    if ( ( substr $text, 0, 1 ) eq '&' ) {    # subroutines
9353        $text = substr $text, 1;
9354        $prefix = "&";
9355        return sort map "$prefix$_", grep /^\Q$text/, ( keys %sub ),
9356          (
9357            map { /$search/ ? ($1) : () }
9358              keys %sub
9359          );
9360    } ## end if ((substr $text, 0, ...
9361
9362=head3  Scalar, array, and hash completion: partially qualified package
9363
9364Much like the above, except we have to do a little more cleanup:
9365
9366=cut
9367
9368    if ( $text =~ /^[\$@%](.*)::(.*)/ ) {    # symbols in a package
9369
9370=pod
9371
9372=over 4
9373
9374=item *
9375
9376Determine the package that the symbol is in. Put it in C<::> (effectively C<main::>) if no package is specified.
9377
9378=cut
9379
9380        $pack = ( $1 eq 'main' ? '' : $1 ) . '::';
9381
9382=pod
9383
9384=item *
9385
9386Figure out the prefix vs. what needs completing.
9387
9388=cut
9389
9390        $prefix = ( substr $text, 0, 1 ) . $1 . '::';
9391        $text   = $2;
9392
9393=pod
9394
9395=item *
9396
9397Look through all the symbols in the package. C<grep> out all the possible hashes/arrays/scalars, and then C<grep> the possible matches out of those. C<map> the prefix onto all the possibilities.
9398
9399=cut
9400
9401        my @out = do {
9402            no strict 'refs';
9403            map "$prefix$_", grep /^\Q$text/, grep /^_?[a-zA-Z]/,
9404            keys %$pack;
9405        };
9406
9407=pod
9408
9409=item *
9410
9411If there's only one hit, and it's a package qualifier, and it's not equal to the initial text, re-complete it using the symbol we actually found.
9412
9413=cut
9414
9415        if ( @out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext ) {
9416            return db_complete( $out[0], $line, $start );
9417        }
9418
9419        # Return the list of possibles.
9420        return sort @out;
9421
9422    } ## end if ($text =~ /^[\$@%](.*)::(.*)/)
9423
9424=pod
9425
9426=back
9427
9428=head3 Symbol completion: current package or package C<main>.
9429
9430=cut
9431
9432    if ( $text =~ /^[\$@%]/ ) {    # symbols (in $package + packages in main)
9433=pod
9434
9435=over 4
9436
9437=item *
9438
9439If it's C<main>, delete main to just get C<::> leading.
9440
9441=cut
9442
9443        $pack = ( $package eq 'main' ? '' : $package ) . '::';
9444
9445=pod
9446
9447=item *
9448
9449We set the prefix to the item's sigil, and trim off the sigil to get the text to be completed.
9450
9451=cut
9452
9453        $prefix = substr $text, 0, 1;
9454        $text   = substr $text, 1;
9455
9456        my @out;
9457
9458=pod
9459
9460=item *
9461
9462We look for the lexical scope above DB::DB and auto-complete lexical variables
9463if PadWalker could be loaded.
9464
9465=cut
9466
9467        if (not $text =~ /::/ and eval {
9468            local @INC = @INC;
9469            pop @INC if $INC[-1] eq '.';
9470            require PadWalker } ) {
9471            my $level = 1;
9472            while (1) {
9473                my @info = caller($level);
9474                $level++;
9475                $level = -1, last
9476                  if not @info;
9477                last if $info[3] eq 'DB::DB';
9478            }
9479            if ($level > 0) {
9480                my $lexicals = PadWalker::peek_my($level);
9481                push @out, grep /^\Q$prefix$text/, keys %$lexicals;
9482            }
9483        }
9484
9485=pod
9486
9487=item *
9488
9489If the package is C<::> (C<main>), create an empty list; if it's something else, create a list of all the packages known.  Append whichever list to a list of all the possible symbols in the current package. C<grep> out the matches to the text entered so far, then C<map> the prefix back onto the symbols.
9490
9491=cut
9492
9493        push @out, map "$prefix$_", grep /^\Q$text/,
9494          ( grep /^_?[a-zA-Z]/, do { no strict 'refs'; keys %$pack } ),
9495          ( $pack eq '::' ? () : ( grep /::$/, keys %:: ) );
9496
9497=item *
9498
9499If there's only one hit, it's a package qualifier, and it's not equal to the initial text, recomplete using this symbol.
9500
9501=back
9502
9503=cut
9504
9505        if ( @out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext ) {
9506            return db_complete( $out[0], $line, $start );
9507        }
9508
9509        # Return the list of possibles.
9510        return sort @out;
9511    } ## end if ($text =~ /^[\$@%]/)
9512
9513=head3 Options
9514
9515We use C<option_val()> to look up the current value of the option. If there's
9516only a single value, we complete the command in such a way that it is a
9517complete command for setting the option in question. If there are multiple
9518possible values, we generate a command consisting of the option plus a trailing
9519question mark, which, if executed, will list the current value of the option.
9520
9521=cut
9522
9523    if ( ( substr $line, 0, $start ) =~ /^\|*[oO]\b.*\s$/ )
9524    {    # Options after space
9525           # We look for the text to be matched in the list of possible options,
9526           # and fetch the current value.
9527        my @out = grep /^\Q$text/, @options;
9528        my $val = option_val( $out[0], undef );
9529
9530        # Set up a 'query option's value' command.
9531        my $out = '? ';
9532        if ( not defined $val or $val =~ /[\n\r]/ ) {
9533
9534            # There's really nothing else we can do.
9535        }
9536
9537        # We have a value. Create a proper option-setting command.
9538        elsif ( $val =~ /\s/ ) {
9539
9540            # XXX This may be an extraneous variable.
9541            my $found;
9542
9543            # We'll want to quote the string (because of the embedded
9544            # whtespace), but we want to make sure we don't end up with
9545            # mismatched quote characters. We try several possibilities.
9546            foreach my $l ( split //, qq/\"\'\#\|/ ) {
9547
9548                # If we didn't find this quote character in the value,
9549                # quote it using this quote character.
9550                $out = "$l$val$l ", last if ( index $val, $l ) == -1;
9551            }
9552        } ## end elsif ($val =~ /\s/)
9553
9554        # Don't need any quotes.
9555        else {
9556            $out = "=$val ";
9557        }
9558
9559        # If there were multiple possible values, return '? ', which
9560        # makes the command into a query command. If there was just one,
9561        # have readline append that.
9562        $rl_attribs->{completer_terminator_character} =
9563          ( @out == 1 ? $out : '? ' );
9564
9565        # Return list of possibilities.
9566        return sort @out;
9567    } ## end if ((substr $line, 0, ...
9568
9569=head3 Filename completion
9570
9571For entering filenames. We simply call C<readline>'s C<filename_list()>
9572method with the completion text to get the possible completions.
9573
9574=cut
9575
9576    return $term->filename_list($text);    # filenames
9577
9578} ## end sub db_complete
9579
9580=head1 MISCELLANEOUS SUPPORT FUNCTIONS
9581
9582Functions that possibly ought to be somewhere else.
9583
9584=head2 end_report
9585
9586Say we're done.
9587
9588=cut
9589
9590sub end_report {
9591    local $\ = '';
9592    print $OUT "Use 'q' to quit or 'R' to restart.  'h q' for details.\n";
9593}
9594
9595=head2 clean_ENV
9596
9597If we have $ini_pids, save it in the environment; else remove it from the
9598environment. Used by the C<R> (restart) command.
9599
9600=cut
9601
9602sub clean_ENV {
9603    if ( defined($ini_pids) ) {
9604        $ENV{PERLDB_PIDS} = $ini_pids;
9605    }
9606    else {
9607        delete( $ENV{PERLDB_PIDS} );
9608    }
9609} ## end sub clean_ENV
9610
9611# PERLDBf_... flag names from perl.h
9612our ( %DollarCaretP_flags, %DollarCaretP_flags_r );
9613
9614BEGIN {
9615    %DollarCaretP_flags = (
9616        PERLDBf_SUB       => 0x01,     # Debug sub enter/exit
9617        PERLDBf_LINE      => 0x02,     # Keep line #
9618        PERLDBf_NOOPT     => 0x04,     # Switch off optimizations
9619        PERLDBf_INTER     => 0x08,     # Preserve more data
9620        PERLDBf_SUBLINE   => 0x10,     # Keep subr source lines
9621        PERLDBf_SINGLE    => 0x20,     # Start with single-step on
9622        PERLDBf_NONAME    => 0x40,     # For _SUB: no name of the subr
9623        PERLDBf_GOTO      => 0x80,     # Report goto: call DB::goto
9624        PERLDBf_NAMEEVAL  => 0x100,    # Informative names for evals
9625        PERLDBf_NAMEANON  => 0x200,    # Informative names for anon subs
9626        PERLDBf_SAVESRC   => 0x400,    # Save source lines into @{"_<$filename"}
9627        PERLDB_ALL        => 0x33f,    # No _NONAME, _GOTO
9628    );
9629    # PERLDBf_LINE also enables the actions of PERLDBf_SAVESRC, so the debugger
9630    # doesn't need to set it. It's provided for the benefit of profilers and
9631    # other code analysers.
9632
9633    %DollarCaretP_flags_r = reverse %DollarCaretP_flags;
9634}
9635
9636sub parse_DollarCaretP_flags {
9637    my $flags = shift;
9638    $flags =~ s/^\s+//;
9639    $flags =~ s/\s+$//;
9640    my $acu = 0;
9641    foreach my $f ( split /\s*\|\s*/, $flags ) {
9642        my $value;
9643        if ( $f =~ /^0x([[:xdigit:]]+)$/ ) {
9644            $value = hex $1;
9645        }
9646        elsif ( $f =~ /^(\d+)$/ ) {
9647            $value = int $1;
9648        }
9649        elsif ( $f =~ /^DEFAULT$/i ) {
9650            $value = $DollarCaretP_flags{PERLDB_ALL};
9651        }
9652        else {
9653            $f =~ /^(?:PERLDBf_)?(.*)$/i;
9654            $value = $DollarCaretP_flags{ 'PERLDBf_' . uc($1) };
9655            unless ( defined $value ) {
9656                print $OUT (
9657                    "Unrecognized \$^P flag '$f'!\n",
9658                    "Acceptable flags are: "
9659                      . join( ', ', sort keys %DollarCaretP_flags ),
9660                    ", and hexadecimal and decimal numbers.\n"
9661                );
9662                return undef;
9663            }
9664        }
9665        $acu |= $value;
9666    }
9667    $acu;
9668}
9669
9670sub expand_DollarCaretP_flags {
9671    my $DollarCaretP = shift;
9672    my @bits         = (
9673        map {
9674            my $n = ( 1 << $_ );
9675            ( $DollarCaretP & $n )
9676              ? ( $DollarCaretP_flags_r{$n}
9677                  || sprintf( '0x%x', $n ) )
9678              : ()
9679          } 0 .. 31
9680    );
9681    return @bits ? join( '|', @bits ) : 0;
9682}
9683
9684=over 4
9685
9686=item rerun
9687
9688Rerun the current session to:
9689
9690    rerun        current position
9691
9692    rerun 4      command number 4
9693
9694    rerun -4     current command minus 4 (go back 4 steps)
9695
9696Whether this always makes sense, in the current context is unknowable, and is
9697in part left as a useful exercise for the reader.  This sub returns the
9698appropriate arguments to rerun the current session.
9699
9700=cut
9701
9702sub rerun {
9703    my $i = shift;
9704    my @args;
9705    pop(@truehist);                      # strim
9706    unless (defined $truehist[$i]) {
9707        print "Unable to return to non-existent command: $i\n";
9708    } else {
9709        $#truehist = ($i < 0 ? $#truehist + $i : $i > 0 ? $i : $#truehist);
9710        my @temp = @truehist;            # store
9711        push(@DB::typeahead, @truehist); # saved
9712        @truehist = @hist = ();          # flush
9713        @args = restart();              # setup
9714        get_list("PERLDB_HIST");        # clean
9715        set_list("PERLDB_HIST", @temp); # reset
9716    }
9717    return @args;
9718}
9719
9720=item restart
9721
9722Restarting the debugger is a complex operation that occurs in several phases.
9723First, we try to reconstruct the command line that was used to invoke Perl
9724and the debugger.
9725
9726=cut
9727
9728sub restart {
9729    # I may not be able to resurrect you, but here goes ...
9730    print $OUT
9731"Warning: some settings and command-line options may be lost!\n";
9732    my ( @script, @flags, $cl );
9733
9734    # If warn was on before, turn it on again.
9735    push @flags, '-w' if $ini_warn;
9736
9737    # Rebuild the -I flags that were on the initial
9738    # command line.
9739    for (@ini_INC) {
9740        push @flags, '-I', $_;
9741    }
9742
9743    # Turn on taint if it was on before.
9744    push @flags, '-T' if ${^TAINT};
9745
9746    # Arrange for setting the old INC:
9747    # Save the current @init_INC in the environment.
9748    set_list( "PERLDB_INC", @ini_INC );
9749
9750    # If this was a perl one-liner, go to the "file"
9751    # corresponding to the one-liner read all the lines
9752    # out of it (except for the first one, which is going
9753    # to be added back on again when 'perl -d' runs: that's
9754    # the 'require perl5db.pl;' line), and add them back on
9755    # to the command line to be executed.
9756    if ( $0 eq '-e' ) {
9757        my $lines = *{$main::{'_<-e'}}{ARRAY};
9758        for ( 1 .. $#$lines ) {  # The first line is PERL5DB
9759            chomp( $cl = $lines->[$_] );
9760            push @script, '-e', $cl;
9761        }
9762    } ## end if ($0 eq '-e')
9763
9764    # Otherwise we just reuse the original name we had
9765    # before.
9766    else {
9767        @script = $0;
9768    }
9769
9770=pod
9771
9772After the command line  has been reconstructed, the next step is to save
9773the debugger's status in environment variables. The C<DB::set_list> routine
9774is used to save aggregate variables (both hashes and arrays); scalars are
9775just popped into environment variables directly.
9776
9777=cut
9778
9779    # If the terminal supported history, grab it and
9780    # save that in the environment.
9781    set_list( "PERLDB_HIST",
9782          $term->Features->{getHistory}
9783        ? $term->GetHistory
9784        : @hist );
9785
9786    # Find all the files that were visited during this
9787    # session (i.e., the debugger had magic hashes
9788    # corresponding to them) and stick them in the environment.
9789    my @had_breakpoints = keys %had_breakpoints;
9790    set_list( "PERLDB_VISITED", @had_breakpoints );
9791
9792    # Save the debugger options we chose.
9793    set_list( "PERLDB_OPT", %option );
9794    # set_list( "PERLDB_OPT", options2remember() );
9795
9796    # Save the break-on-loads.
9797    set_list( "PERLDB_ON_LOAD", %break_on_load );
9798
9799=pod
9800
9801The most complex part of this is the saving of all of the breakpoints. They
9802can live in an awful lot of places, and we have to go through all of them,
9803find the breakpoints, and then save them in the appropriate environment
9804variable via C<DB::set_list>.
9805
9806=cut
9807
9808    # Go through all the breakpoints and make sure they're
9809    # still valid.
9810    my @hard;
9811    for ( 0 .. $#had_breakpoints ) {
9812
9813        # We were in this file.
9814        my $file = $had_breakpoints[$_];
9815
9816        # Grab that file's magic line hash.
9817        *dbline = $main::{ '_<' . $file };
9818
9819        # Skip out if it doesn't exist, or if the breakpoint
9820        # is in a postponed file (we'll do postponed ones
9821        # later).
9822        next unless %dbline or $postponed_file{$file};
9823
9824        # In an eval. This is a little harder, so we'll
9825        # do more processing on that below.
9826        ( push @hard, $file ), next
9827          if $file =~ /^\(\w*eval/;
9828
9829        # XXX I have no idea what this is doing. Yet.
9830        my @add;
9831        @add = %{ $postponed_file{$file} }
9832          if $postponed_file{$file};
9833
9834        # Save the list of all the breakpoints for this file.
9835        set_list( "PERLDB_FILE_$_", %dbline, @add );
9836
9837        # Serialize the extra data %breakpoints_data hash.
9838        # That's a bug fix.
9839        set_list( "PERLDB_FILE_ENABLED_$_",
9840            map { _is_breakpoint_enabled($file, $_) ? 1 : 0 }
9841            sort { $a <=> $b } keys(%dbline)
9842        )
9843    } ## end for (0 .. $#had_breakpoints)
9844
9845    # The breakpoint was inside an eval. This is a little
9846    # more difficult. XXX and I don't understand it.
9847    foreach my $hard_file (@hard) {
9848        # Get over to the eval in question.
9849        *dbline = $main::{ '_<' . $hard_file };
9850        my $quoted = quotemeta $hard_file;
9851        my %subs;
9852        for my $sub ( keys %sub ) {
9853            if (my ($n1, $n2) = $sub{$sub} =~ /\A$quoted:(\d+)-(\d+)\z/) {
9854                $subs{$sub} = [ $n1, $n2 ];
9855            }
9856        }
9857        unless (%subs) {
9858            print {$OUT}
9859            "No subroutines in $hard_file, ignoring breakpoints.\n";
9860            next;
9861        }
9862        LINES: foreach my $line ( keys %dbline ) {
9863
9864            # One breakpoint per sub only:
9865            my ( $offset, $found );
9866            SUBS: foreach my $sub ( keys %subs ) {
9867                if (
9868                    $subs{$sub}->[1] >= $line    # Not after the subroutine
9869                    and (
9870                        not defined $offset    # Not caught
9871                            or $offset < 0
9872                    )
9873                )
9874                {                              # or badly caught
9875                    $found  = $sub;
9876                    $offset = $line - $subs{$sub}->[0];
9877                    if ($offset >= 0) {
9878                        $offset = "+$offset";
9879                        last SUBS;
9880                    }
9881                } ## end if ($subs{$sub}->[1] >=...
9882            } ## end for $sub (keys %subs)
9883            if ( defined $offset ) {
9884                $postponed{$found} =
9885                "break $offset if $dbline{$line}";
9886            }
9887            else {
9888                print {$OUT}
9889                ("Breakpoint in ${hard_file}:$line ignored:"
9890                . " after all the subroutines.\n");
9891            }
9892        } ## end for $line (keys %dbline)
9893    } ## end for (@hard)
9894
9895    # Save the other things that don't need to be
9896    # processed.
9897    set_list( "PERLDB_POSTPONE",  %postponed );
9898    set_list( "PERLDB_PRETYPE",   @$pretype );
9899    set_list( "PERLDB_PRE",       @$pre );
9900    set_list( "PERLDB_POST",      @$post );
9901    set_list( "PERLDB_TYPEAHEAD", @typeahead );
9902
9903    # We are officially restarting.
9904    $ENV{PERLDB_RESTART} = 1;
9905
9906    # We are junking all child debuggers.
9907    delete $ENV{PERLDB_PIDS};    # Restore ini state
9908
9909    # Set this back to the initial pid.
9910    $ENV{PERLDB_PIDS} = $ini_pids if defined $ini_pids;
9911
9912=pod
9913
9914After all the debugger status has been saved, we take the command we built up
9915and then return it, so we can C<exec()> it. The debugger will spot the
9916C<PERLDB_RESTART> environment variable and realize it needs to reload its state
9917from the environment.
9918
9919=cut
9920
9921    # And run Perl again. Add the "-d" flag, all the
9922    # flags we built up, the script (whether a one-liner
9923    # or a file), add on the -emacs flag for a slave editor,
9924    # and then the old arguments.
9925
9926    return ($^X, '-d', @flags, @script, ($slave_editor ? '-emacs' : ()), @ARGS);
9927
9928};  # end restart
9929
9930=back
9931
9932=head1 END PROCESSING - THE C<END> BLOCK
9933
9934Come here at the very end of processing. We want to go into a
9935loop where we allow the user to enter commands and interact with the
9936debugger, but we don't want anything else to execute.
9937
9938First we set the C<$finished> variable, so that some commands that
9939shouldn't be run after the end of program quit working.
9940
9941We then figure out whether we're truly done (as in the user entered a C<q>
9942command, or we finished execution while running nonstop). If we aren't,
9943we set C<$single> to 1 (causing the debugger to get control again).
9944
9945We then call C<DB::fake::at_exit()>, which returns the C<Use 'q' to quit ...>
9946message and returns control to the debugger. Repeat.
9947
9948When the user finally enters a C<q> command, C<$fall_off_end> is set to
99491 and the C<END> block simply exits with C<$single> set to 0 (don't
9950break, run to completion.).
9951
9952=cut
9953
9954END {
9955    $finished = 1 if $inhibit_exit;    # So that some commands may be disabled.
9956    $fall_off_end = 1 unless $inhibit_exit;
9957
9958    # Do not stop in at_exit() and destructors on exit:
9959    if ($fall_off_end or $runnonstop) {
9960        save_hist();
9961    } else {
9962        $DB::single = 1;
9963        DB::fake::at_exit();
9964    }
9965} ## end END
9966
9967=head1 PRE-5.8 COMMANDS
9968
9969Some of the commands changed function quite a bit in the 5.8 command
9970realignment, so much so that the old code had to be replaced completely.
9971Because we wanted to retain the option of being able to go back to the
9972former command set, we moved the old code off to this section.
9973
9974There's an awful lot of duplicated code here. We've duplicated the
9975comments to keep things clear.
9976
9977=head2 Null command
9978
9979Does nothing. Used to I<turn off> commands.
9980
9981=cut
9982
9983sub cmd_pre580_null {
9984
9985    # do nothing...
9986}
9987
9988=head2 Old C<a> command.
9989
9990This version added actions if you supplied them, and deleted them
9991if you didn't.
9992
9993=cut
9994
9995sub cmd_pre580_a {
9996    my $xcmd = shift;
9997    my $cmd  = shift;
9998
9999    # Argument supplied. Add the action.
10000    if ( $cmd =~ /^(\d*)\s*(.*)/ ) {
10001
10002        # If the line isn't there, use the current line.
10003        my $i = $1 || $line;
10004        my $j = $2;
10005
10006        # If there is an action ...
10007        if ( length $j ) {
10008
10009            # ... but the line isn't breakable, skip it.
10010            if ( $dbline[$i] == 0 ) {
10011                print $OUT "Line $i may not have an action.\n";
10012            }
10013            else {
10014
10015                # ... and the line is breakable:
10016                # Mark that there's an action in this file.
10017                $had_breakpoints{$filename} |= 2;
10018
10019                # Delete any current action.
10020                $dbline{$i} =~ s/\0[^\0]*//;
10021
10022                # Add the new action, continuing the line as needed.
10023                $dbline{$i} .= "\0" . action($j);
10024            }
10025        } ## end if (length $j)
10026
10027        # No action supplied.
10028        else {
10029
10030            # Delete the action.
10031            $dbline{$i} =~ s/\0[^\0]*//;
10032
10033            # Mark as having no break or action if nothing's left.
10034            delete $dbline{$i} if $dbline{$i} eq '';
10035        }
10036    } ## end if ($cmd =~ /^(\d*)\s*(.*)/)
10037} ## end sub cmd_pre580_a
10038
10039=head2 Old C<b> command
10040
10041Add breakpoints.
10042
10043=cut
10044
10045sub cmd_pre580_b {
10046    my $xcmd   = shift;
10047    my $cmd    = shift;
10048    my $dbline = shift;
10049
10050    # Break on load.
10051    if ( $cmd =~ /^load\b\s*(.*)/ ) {
10052        my $file = $1;
10053        $file =~ s/\s+$//;
10054        cmd_b_load($file);
10055    }
10056
10057    # b compile|postpone <some sub> [<condition>]
10058    # The interpreter actually traps this one for us; we just put the
10059    # necessary condition in the %postponed hash.
10060    elsif ( $cmd =~ /^(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ ) {
10061
10062        # Capture the condition if there is one. Make it true if none.
10063        my $cond = length $3 ? $3 : '1';
10064
10065        # Save the sub name and set $break to 1 if $1 was 'postpone', 0
10066        # if it was 'compile'.
10067        my ( $subname, $break ) = ( $2, $1 eq 'postpone' );
10068
10069        # De-Perl4-ify the name - ' separators to ::.
10070        $subname =~ s/\'/::/g;
10071
10072        # Qualify it into the current package unless it's already qualified.
10073        $subname = "${package}::" . $subname
10074          unless $subname =~ /::/;
10075
10076        # Add main if it starts with ::.
10077        $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::";
10078
10079        # Save the break type for this sub.
10080        $postponed{$subname} = $break ? "break +0 if $cond" : "compile";
10081    } ## end elsif ($cmd =~ ...
10082
10083    # b <sub name> [<condition>]
10084    elsif ( $cmd =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ ) {
10085        my $subname = $1;
10086        my $cond = length $2 ? $2 : '1';
10087        cmd_b_sub( $subname, $cond );
10088    }
10089    # b <line> [<condition>].
10090    elsif ( $cmd =~ /^(\d*)\s*(.*)/ ) {
10091        my $i = $1 || $dbline;
10092        my $cond = length $2 ? $2 : '1';
10093        cmd_b_line( $i, $cond );
10094    }
10095} ## end sub cmd_pre580_b
10096
10097=head2 Old C<D> command.
10098
10099Delete all breakpoints unconditionally.
10100
10101=cut
10102
10103sub cmd_pre580_D {
10104    my $xcmd = shift;
10105    my $cmd  = shift;
10106    if ( $cmd =~ /^\s*$/ ) {
10107        print $OUT "Deleting all breakpoints...\n";
10108
10109        # %had_breakpoints lists every file that had at least one
10110        # breakpoint in it.
10111        my $file;
10112        for $file ( keys %had_breakpoints ) {
10113
10114            # Switch to the desired file temporarily.
10115            local *dbline = $main::{ '_<' . $file };
10116
10117            $max = $#dbline;
10118            my $was;
10119
10120            # For all lines in this file ...
10121            for my $i (1 .. $max) {
10122
10123                # If there's a breakpoint or action on this line ...
10124                if ( defined $dbline{$i} ) {
10125
10126                    # ... remove the breakpoint.
10127                    $dbline{$i} =~ s/^[^\0]+//;
10128                    if ( $dbline{$i} =~ s/^\0?$// ) {
10129
10130                        # Remove the entry altogether if no action is there.
10131                        delete $dbline{$i};
10132                    }
10133                } ## end if (defined $dbline{$i...
10134            } ## end for my $i (1 .. $max)
10135
10136            # If, after we turn off the "there were breakpoints in this file"
10137            # bit, the entry in %had_breakpoints for this file is zero,
10138            # we should remove this file from the hash.
10139            if ( not $had_breakpoints{$file} &= ~1 ) {
10140                delete $had_breakpoints{$file};
10141            }
10142        } ## end for $file (keys %had_breakpoints)
10143
10144        # Kill off all the other breakpoints that are waiting for files that
10145        # haven't been loaded yet.
10146        undef %postponed;
10147        undef %postponed_file;
10148        undef %break_on_load;
10149    } ## end if ($cmd =~ /^\s*$/)
10150} ## end sub cmd_pre580_D
10151
10152=head2 Old C<h> command
10153
10154Print help. Defaults to printing the long-form help; the 5.8 version
10155prints the summary by default.
10156
10157=cut
10158
10159sub cmd_pre580_h {
10160    my $xcmd = shift;
10161    my $cmd  = shift;
10162
10163    # Print the *right* help, long format.
10164    if ( $cmd =~ /^\s*$/ ) {
10165        print_help($pre580_help);
10166    }
10167
10168    # 'h h' - explicitly-requested summary.
10169    elsif ( $cmd =~ /^h\s*/ ) {
10170        print_help($pre580_summary);
10171    }
10172
10173    # Find and print a command's help.
10174    elsif ( $cmd =~ /^h\s+(\S.*)$/ ) {
10175        my $asked  = $1;                   # for proper errmsg
10176        my $qasked = quotemeta($asked);    # for searching
10177                                           # XXX: finds CR but not <CR>
10178        if (
10179            $pre580_help =~ /^
10180                              <?           # Optional '<'
10181                              (?:[IB]<)    # Optional markup
10182                              $qasked      # The command name
10183                            /mx
10184          )
10185        {
10186
10187            while (
10188                $pre580_help =~ /^
10189                                  (             # The command help:
10190                                   <?           # Optional '<'
10191                                   (?:[IB]<)    # Optional markup
10192                                   $qasked      # The command name
10193                                   ([\s\S]*?)   # Lines starting with tabs
10194                                   \n           # Final newline
10195                                  )
10196                                  (?!\s)/mgx
10197              )    # Line not starting with space
10198                   # (Next command's help)
10199            {
10200                print_help($1);
10201            }
10202        } ## end if ($pre580_help =~ /^<?(?:[IB]<)$qasked/m)
10203
10204        # Help not found.
10205        else {
10206            print_help("B<$asked> is not a debugger command.\n");
10207        }
10208    } ## end elsif ($cmd =~ /^h\s+(\S.*)$/)
10209} ## end sub cmd_pre580_h
10210
10211=head2 Old C<W> command
10212
10213C<W E<lt>exprE<gt>> adds a watch expression, C<W> deletes them all.
10214
10215=cut
10216
10217sub cmd_pre580_W {
10218    my $xcmd = shift;
10219    my $cmd  = shift;
10220
10221    # Delete all watch expressions.
10222    if ( $cmd =~ /^$/ ) {
10223
10224        # No watching is going on.
10225        $trace &= ~2;
10226
10227        # Kill all the watch expressions and values.
10228        @to_watch = @old_watch = ();
10229    }
10230
10231    # Add a watch expression.
10232    elsif ( $cmd =~ /^(.*)/s ) {
10233
10234        # add it to the list to be watched.
10235        push @to_watch, $1;
10236
10237        # Get the current value of the expression.
10238        # Doesn't handle expressions returning list values!
10239        $evalarg = $1;
10240        # The &-call is here to ascertain the mutability of @_.
10241        my ($val) = &DB::eval;
10242        $val = ( defined $val ) ? "'$val'" : 'undef';
10243
10244        # Save it.
10245        push @old_watch, $val;
10246
10247        # We're watching stuff.
10248        $trace |= 2;
10249
10250    } ## end elsif ($cmd =~ /^(.*)/s)
10251} ## end sub cmd_pre580_W
10252
10253=head1 PRE-AND-POST-PROMPT COMMANDS AND ACTIONS
10254
10255The debugger used to have a bunch of nearly-identical code to handle
10256the pre-and-post-prompt action commands. C<cmd_pre590_prepost> and
10257C<cmd_prepost> unify all this into one set of code to handle the
10258appropriate actions.
10259
10260=head2 C<cmd_pre590_prepost>
10261
10262A small wrapper around C<cmd_prepost>; it makes sure that the default doesn't
10263do something destructive. In pre 5.8 debuggers, the default action was to
10264delete all the actions.
10265
10266=cut
10267
10268sub cmd_pre590_prepost {
10269    my $cmd    = shift;
10270    my $line   = shift || '*';
10271    my $dbline = shift;
10272
10273    return cmd_prepost( $cmd, $line, $dbline );
10274} ## end sub cmd_pre590_prepost
10275
10276=head2 C<cmd_prepost>
10277
10278Actually does all the handling for C<E<lt>>, C<E<gt>>, C<{{>, C<{>, etc.
10279Since the lists of actions are all held in arrays that are pointed to by
10280references anyway, all we have to do is pick the right array reference and
10281then use generic code to all, delete, or list actions.
10282
10283=cut
10284
10285sub cmd_prepost {
10286    my $cmd = shift;
10287
10288    # No action supplied defaults to 'list'.
10289    my $line = shift || '?';
10290
10291    # Figure out what to put in the prompt.
10292    my $which = '';
10293
10294    # Make sure we have some array or another to address later.
10295    # This means that if for some reason the tests fail, we won't be
10296    # trying to stash actions or delete them from the wrong place.
10297    my $aref = [];
10298
10299    # < - Perl code to run before prompt.
10300    if ( $cmd =~ /^\</o ) {
10301        $which = 'pre-perl';
10302        $aref  = $pre;
10303    }
10304
10305    # > - Perl code to run after prompt.
10306    elsif ( $cmd =~ /^\>/o ) {
10307        $which = 'post-perl';
10308        $aref  = $post;
10309    }
10310
10311    # { - first check for properly-balanced braces.
10312    elsif ( $cmd =~ /^\{/o ) {
10313        if ( $cmd =~ /^\{.*\}$/o && unbalanced( substr( $cmd, 1 ) ) ) {
10314            print $OUT
10315"$cmd is now a debugger command\nuse ';$cmd' if you mean Perl code\n";
10316        }
10317
10318        # Properly balanced. Pre-prompt debugger actions.
10319        else {
10320            $which = 'pre-debugger';
10321            $aref  = $pretype;
10322        }
10323    } ## end elsif ( $cmd =~ /^\{/o )
10324
10325    # Did we find something that makes sense?
10326    unless ($which) {
10327        print $OUT "Confused by command: $cmd\n";
10328    }
10329
10330    # Yes.
10331    else {
10332
10333        # List actions.
10334        if ( $line =~ /^\s*\?\s*$/o ) {
10335            unless (@$aref) {
10336
10337                # Nothing there. Complain.
10338                print $OUT "No $which actions.\n";
10339            }
10340            else {
10341
10342                # List the actions in the selected list.
10343                print $OUT "$which commands:\n";
10344                foreach my $action (@$aref) {
10345                    print $OUT "\t$cmd -- $action\n";
10346                }
10347            } ## end else
10348        } ## end if ( $line =~ /^\s*\?\s*$/o)
10349
10350        # Might be a delete.
10351        else {
10352            if ( length($cmd) == 1 ) {
10353                if ( $line =~ /^\s*\*\s*$/o ) {
10354
10355                    # It's a delete. Get rid of the old actions in the
10356                    # selected list..
10357                    @$aref = ();
10358                    print $OUT "All $cmd actions cleared.\n";
10359                }
10360                else {
10361
10362                    # Replace all the actions. (This is a <, >, or {).
10363                    @$aref = action($line);
10364                }
10365            } ## end if ( length($cmd) == 1)
10366            elsif ( length($cmd) == 2 ) {
10367
10368                # Add the action to the line. (This is a <<, >>, or {{).
10369                push @$aref, action($line);
10370            }
10371            else {
10372
10373                # <<<, >>>>, {{{{{{ ... something not a command.
10374                print $OUT
10375                  "Confused by strange length of $which command($cmd)...\n";
10376            }
10377        } ## end else [ if ( $line =~ /^\s*\?\s*$/o)
10378    } ## end else
10379} ## end sub cmd_prepost
10380
10381=head1 C<DB::fake>
10382
10383Contains the C<at_exit> routine that the debugger uses to issue the
10384C<Debugged program terminated ...> message after the program completes. See
10385the C<END> block documentation for more details.
10386
10387=cut
10388
10389package DB::fake;
10390
10391sub at_exit {
10392    "Debugged program terminated.  Use 'q' to quit or 'R' to restart.";
10393}
10394
10395package DB;    # Do not trace this 1; below!
10396
103971;
10398
10399
10400