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