=head1 The Perl Debugger
+"As soon as we started programming, we found to our
+surprise that it wasn't as easy to get programs right
+as we had thought. Debugging had to be discovered.
+I can remember the exact instant when I realized that
+a large part of my life from then on was going to be
+spent in finding mistakes in my own programs."
+--Maurice Wilkes, 1949
+
If you invoke Perl with the B<-d> switch, your script runs under the
Perl source debugger. This works like an interactive Perl
environment, prompting for debugger commands that let you examine
-source code, set breakpoints, get stack back-traces, change the values of
+source code, set breakpoints, get stack backtraces, change the values of
variables, etc. This is so convenient that you often fire up
-the debugger all by itself just to test out Perl constructs
+the debugger all by itself just to test out Perl constructs
interactively to see what they do. For example:
perl -d -e 42
to insert source information into the parse trees it's about to hand off
to the interpreter. That means your code must first compile correctly
for the debugger to work on it. Then when the interpreter starts up, it
-pre-loads a Perl library file containing the debugger itself.
+preloads a Perl library file containing the debugger itself.
The program will halt I<right before> the first run-time executable
statement (but see below regarding compile-time statements) and ask you
=item h [command]
-Prints out a help message.
+Prints out a help message.
If you supply another debugger command as an argument to the C<h> command,
it prints out the description for just that command. The special
=item x expr
-Evaluates its expression in list context and dumps out the result
+Evaluates its expression in list context and dumps out the result
in a pretty-printed fashion. Nested data structures are printed out
recursively, unlike the C<print> function.
=item T
-Produce a stack back-trace. See below for details on its output.
+Produce a stack backtrace. See below for details on its output.
=item s [expr]
Level of verbosity. By default the debugger is in a sane verbose mode,
thus it will print backtraces on all the warnings and die-messages
which are going to be printed out, and will print a message when
-interesting uncaught signals arrive.
+interesting uncaught signals arrive.
To disable this behaviour, set these values to 0. If C<dieLevel> is 2,
then the messages which will be caught by surrounding C<eval> are also
If 0, allows I<stepping off> the end of the script.
-=item C<PrintRet>
+=item C<PrintRet>
affects printing of return value after C<r> command.
-=item C<frame>
+=item C<ornaments>
+
+affects screen appearance of the command line (see L<Term::ReadLine>).
+
+=item C<frame>
affects printing messages on entry and exit from subroutines. If
C<frame & 2> is false, messages are printed on entry only. (Printing
If C<frame & 4>, arguments to functions are printed as well as the
context and caller info. If C<frame & 8>, overloaded C<stringify> and
-C<tie>d C<FETCH> are enabled on the printed arguments. The length at
-which the argument list is truncated is governed by the next option:
+C<tie>d C<FETCH> are enabled on the printed arguments. If C<frame &
+16>, the return value from the subroutine is printed as well.
+
+The length at which the argument list is truncated is governed by the
+next option:
=item C<maxTraceLen>
to C<"> or C<'>. By default, characters with high bit set are printed
I<as is>.
-=item C<UsageOnly>
+=item C<UsageOnly>
I<very> rudimentally per-package memory usage dump. Calculates total
size of strings in variables in the package.
=item C<NonStop>
-If set, debugger goes into non-interactive mode until interrupted, or
+If set, debugger goes into noninteractive mode until interrupted, or
programmatically by setting $DB::signal or $DB::single.
=back
$ PERLDB_OPTS="N f A L=listing" perl -d myprogram
-- runs script non-interactively, printing info on each entry into a
+- runs script noninteractively, printing info on each entry into a
subroutine and each executed line into the file F<listing>. (If you
interrupt it, you would better reset C<LineInfo> to something
"interactive"!)
See L<"Debugger Internals"> below for more details.
-=over 12
-
=item E<lt> [ command ]
Set an action (Perl command) to happen before every debugger prompt.
may be lost.
Currently the following setting are preserved: history, breakpoints,
-actions, debugger C<O>ptions, and the following command-line
+actions, debugger C<O>ptions, and the following command line
options: B<-w>, B<-I>, and B<-e>.
=item |dbcmd
DB<<17>>
where that number is the command number, which you'd use to access with
-the built-in B<csh>-like history mechanism, e.g., C<!17> would repeat
+the builtin B<csh>-like history mechanism, e.g., C<!17> would repeat
command number 17. The number of angle brackets indicates the depth of
the debugger. You could get more than one set of brackets, for example, if
you'd already at a breakpoint and then printed out the result of a
function call that itself also has a breakpoint, or you step into an
expression via C<s/n/t expression> command.
-=item Multi-line commands
+=item Multiline commands
If you want to enter a multi-line command, such as a subroutine
definition with several statements, or a format, you may escape the
=item Stack backtrace
-Here's an example of what a stack back-trace via C<T> command might
+Here's an example of what a stack backtrace via C<T> command might
look like:
$ = main::infested called from file `Ambulation.pm' line 10
When C<frame> option is set, debugger would print entered (and
optionally exited) subroutines in different styles.
-What follows is the start of the listing of
+What follows is the start of the listing of
- env "PERLDB_OPTS=f=1 N" perl -d -V
+ env "PERLDB_OPTS=f=n N" perl -d -V
+
+for different values of C<n>:
=over 4
in $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
out $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
+=item 30
+
+ in $=CODE(0x15eca4)() from /dev/null:0
+ in $=CODE(0x182528)() from lib/Config.pm:2
+ Package lib/Exporter.pm.
+ out $=CODE(0x182528)() from lib/Config.pm:0
+ scalar context return from CODE(0x182528): undef
+ Package lib/Config.pm.
+ in $=Config::TIEHASH('Config') from lib/Config.pm:628
+ out $=Config::TIEHASH('Config') from lib/Config.pm:628
+ scalar context return from Config::TIEHASH: empty hash
+ in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
+ out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
+ scalar context return from Exporter::export: ''
+ out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ scalar context return from Exporter::import: ''
+
+
=back
In all the cases indentation of lines shows the call tree, if bit 2 of
C<frame> is set, then a line is printed on exit from a subroutine as
well, if bit 4 is set, then the arguments are printed as well as the
caller info, if bit 8 is set, the arguments are printed even if they
-are tied or references.
+are tied or references, if bit 16 is set, the return value is printed
+as well.
When a package is compiled, a line like this
If you have any compile-time executable statements (code within a BEGIN
block or a C<use> statement), these will C<NOT> be stopped by debugger,
although C<require>s will (and compile-time statements can be traced
-with C<AutoTrace> option set in C<PERLDB_OPTS>). From your own Perl
+with C<AutoTrace> option set in C<PERLDB_OPTS>). From your own Perl
code, however, you can
transfer control back to the debugger using the following statement,
which is harmless if the debugger is not running:
have full editing capabilities much like GNU I<readline>(3) provides.
Look for these in the F<modules/by-module/Term> directory on CPAN.
-A rudimentary command-line completion is also available.
+A rudimentary command line completion is also available.
Unfortunately, the names of lexical variables are not available for
completion.
When you call the B<caller> function (see L<perlfunc/caller>) from the
package DB, Perl sets the array @DB::args to contain the arguments the
-corresponding stack frame was called with.
+corresponding stack frame was called with.
If perl is run with B<-d> option, the following additional features
are enabled:
The following debugger is quite functional:
- {
- package DB;
- sub DB {}
+ {
+ package DB;
+ sub DB {}
sub sub {print ++$i, " $sub\n"; &$sub}
}
=head2 Debugger Internals
At the start, the debugger reads your rc file (F<./.perldb> or
-F<~/.perldb> under UNIX), which can set important options. This file may
+F<~/.perldb> under Unix), which can set important options. This file may
define a subroutine C<&afterinit> to be executed after the debugger is
initialized.
eval), C<args> (C<undef> or a reference to an array), C<file>, and
C<line>.
-The function C<DB::print_trace(FH, skip[, count[, short]])> prints
+The function C<DB::print_trace(FH, skip[, count[, short]])> prints
formatted info about caller frames. The last two functions may be
convenient as arguments to C<E<lt>>, C<E<lt>E<lt>> commands.
that were not compiled by Perl, such as C or C++ extensions.
If you alter your @_ arguments in a subroutine (such as with B<shift>
-or B<pop>, the stack back-trace will not show the original values.
+or B<pop>, the stack backtrace will not show the original values.