ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/staticperl/perl/lib/perl5db.pl
Revision: 1.1
Committed: Thu Jun 30 14:27:09 2005 UTC (21 years, 3 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

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