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