diff options
Diffstat (limited to 'upstream/mageia-cauldron/man1/perldebug.1')
-rw-r--r-- | upstream/mageia-cauldron/man1/perldebug.1 | 1213 |
1 files changed, 1213 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man1/perldebug.1 b/upstream/mageia-cauldron/man1/perldebug.1 new file mode 100644 index 00000000..bdbb3cf2 --- /dev/null +++ b/upstream/mageia-cauldron/man1/perldebug.1 @@ -0,0 +1,1213 @@ +.\" -*- mode: troff; coding: utf-8 -*- +.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. +.ie n \{\ +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is >0, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" ======================================================================== +.\" +.IX Title "PERLDEBUG 1" +.TH PERLDEBUG 1 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH NAME +perldebug \- Perl debugging +.IX Xref "debug debugger" +.SH DESCRIPTION +.IX Header "DESCRIPTION" +First of all, have you tried using \f(CW\*(C`use strict;\*(C'\fR and +\&\f(CW\*(C`use warnings;\*(C'\fR? +.PP +If you're new to the Perl debugger, you may prefer to read +perldebtut, which is a tutorial introduction to the debugger. +.PP +If you're looking for the nitty gritty details of how the debugger is +\&\fIimplemented\fR, you may prefer to read perldebguts. +.PP +For in-depth technical usage details, see perl5db.pl, the documentation +of the debugger itself. +.SH "The Perl Debugger" +.IX Header "The Perl Debugger" +If you invoke Perl with the \fB\-d\fR 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 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 +interactively to see what they do. For example: +.IX Xref "-d" +.PP +.Vb 1 +\& $ perl \-d \-e 42 +.Ve +.PP +In Perl, the debugger is not a separate program the way it usually is in the +typical compiled environment. Instead, the \fB\-d\fR flag tells the compiler +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 +preloads a special Perl library file containing the debugger. +.PP +The program will halt \fIright before\fR the first run-time executable +statement (but see below regarding compile-time statements) and ask you +to enter a debugger command. Contrary to popular expectations, whenever +the debugger halts and shows you a line of code, it always displays the +line it's \fIabout\fR to execute, rather than the one it has just executed. +.PP +Any command not recognized by the debugger is directly executed +(\f(CW\*(C`eval\*(C'\fR'd) as Perl code in the current package. (The debugger +uses the DB package for keeping its own state information.) +.PP +Note that the said \f(CW\*(C`eval\*(C'\fR is bound by an implicit scope. As a +result any newly introduced lexical variable or any modified +capture buffer content is lost after the eval. The debugger is a +nice environment to learn Perl, but if you interactively experiment using +material which should be in the same scope, stuff it in one line. +.PP +For any text entered at the debugger prompt, leading and trailing whitespace +is first stripped before further processing. If a debugger command +coincides with some function in your own program, merely precede the +function with something that doesn't look like a debugger command, such +as a leading \f(CW\*(C`;\*(C'\fR or perhaps a \f(CW\*(C`+\*(C'\fR, or by wrapping it with parentheses +or braces. +.SS "Calling the Debugger" +.IX Subsection "Calling the Debugger" +There are several ways to call the debugger: +.IP "perl \-d program_name" 4 +.IX Item "perl -d program_name" +On the given program identified by \f(CW\*(C`program_name\*(C'\fR. +.IP "perl \-d \-e 0" 4 +.IX Item "perl -d -e 0" +Interactively supply an arbitrary \f(CW\*(C`expression\*(C'\fR using \f(CW\*(C`\-e\*(C'\fR. +.IP "perl \-d:ptkdb program_name" 4 +.IX Item "perl -d:ptkdb program_name" +Debug a given program via the Devel::ptkdb GUI. +.IP "perl \-dt threaded_program_name" 4 +.IX Item "perl -dt threaded_program_name" +Debug a given program using threads (experimental). +.PP +If Perl is called with the \f(CW\*(C`\-d\*(C'\fR switch, the variable \f(CW$^P\fR will hold a true +value. This is useful if you need to know if your code is running under the +debugger: +.PP +.Vb 3 +\& if ( $^P ) { +\& # running under the debugger +\& } +.Ve +.PP +See "$^P" in perlvar for more information on the variable. +.SS "Debugger Commands" +.IX Subsection "Debugger Commands" +The interactive debugger understands the following commands: +.IP h 12 +.IX Xref "debugger command, h" +.IX Item "h" +Prints out a summary help message +.IP "h [command]" 12 +.IX Item "h [command]" +Prints out a help message for the given debugger command. +.IP "h h" 12 +.IX Item "h h" +The special argument of \f(CW\*(C`h h\*(C'\fR produces the entire help page, which is quite long. +.Sp +If the output of the \f(CW\*(C`h h\*(C'\fR command (or any command, for that matter) scrolls +past your screen, precede the command with a leading pipe symbol so +that it's run through your pager, as in +.Sp +.Vb 1 +\& DB> |h h +.Ve +.Sp +You may change the pager which is used via \f(CW\*(C`o pager=...\*(C'\fR command. +.IP "p expr" 12 +.IX Xref "debugger command, p" +.IX Item "p expr" +Same as \f(CW\*(C`print {$DB::OUT} expr\*(C'\fR in the current package. In particular, +because this is just Perl's own \f(CW\*(C`print\*(C'\fR function, this means that nested +data structures and objects are not dumped, unlike with the \f(CW\*(C`x\*(C'\fR command. +.Sp +The \f(CW\*(C`DB::OUT\*(C'\fR filehandle is opened to \fI/dev/tty\fR, regardless of +where STDOUT may be redirected to. +.IP "x [maxdepth] expr" 12 +.IX Xref "debugger command, x" +.IX Item "x [maxdepth] expr" +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 real \f(CW\*(C`print\*(C'\fR function in Perl. When dumping +hashes, you'll probably prefer 'x \e%h' rather than 'x \f(CW%h\fR'. +See Dumpvalue if you'd like to do this yourself. +.Sp +The output format is governed by multiple options described under +"Configurable Options". +.Sp +If the \f(CW\*(C`maxdepth\*(C'\fR is included, it must be a numeral \fIN\fR; the value is +dumped only \fIN\fR levels deep, as if the \f(CW\*(C`dumpDepth\*(C'\fR option had been +temporarily set to \fIN\fR. +.IP "V [pkg [vars]]" 12 +.IX Xref "debugger command, V" +.IX Item "V [pkg [vars]]" +Display all (or some) variables in package (defaulting to \f(CW\*(C`main\*(C'\fR) +using a data pretty-printer (hashes show their keys and values so +you see what's what, control characters are made printable, etc.). +Make sure you don't put the type specifier (like \f(CW\*(C`$\*(C'\fR) there, just +the symbol names, like this: +.Sp +.Vb 1 +\& V DB filename line +.Ve +.Sp +Use \f(CW\*(C`~pattern\*(C'\fR and \f(CW\*(C`!pattern\*(C'\fR for positive and negative regexes. +.Sp +This is similar to calling the \f(CW\*(C`x\*(C'\fR command on each applicable var. +.IP "X [vars]" 12 +.IX Xref "debugger command, X" +.IX Item "X [vars]" +Same as \f(CW\*(C`V currentpackage [vars]\*(C'\fR. +.IP "y [level [vars]]" 12 +.IX Xref "debugger command, y" +.IX Item "y [level [vars]]" +Display all (or some) lexical variables (mnemonic: \f(CW\*(C`mY\*(C'\fR variables) +in the current scope or \fIlevel\fR scopes higher. You can limit the +variables that you see with \fIvars\fR which works exactly as it does +for the \f(CW\*(C`V\*(C'\fR and \f(CW\*(C`X\*(C'\fR commands. Requires the PadWalker module +version 0.08 or higher; will warn if this isn't installed. Output +is pretty-printed in the same style as for \f(CW\*(C`V\*(C'\fR and the format is +controlled by the same options. +.IP T 12 +.IX Xref "debugger command, T backtrace stack, backtrace" +.IX Item "T" +Produce a stack backtrace. See below for details on its output. +.IP "s [expr]" 12 +.IX Xref "debugger command, s step" +.IX Item "s [expr]" +Single step. Executes until the beginning of another +statement, descending into subroutine calls. If an expression is +supplied that includes function calls, it too will be single-stepped. +.IP "n [expr]" 12 +.IX Xref "debugger command, n" +.IX Item "n [expr]" +Next. Executes over subroutine calls, until the beginning +of the next statement. If an expression is supplied that includes +function calls, those functions will be executed with stops before +each statement. +.IP r 12 +.IX Xref "debugger command, r" +.IX Item "r" +Continue until the return from the current subroutine. +Dump the return value if the \f(CW\*(C`PrintRet\*(C'\fR option is set (default). +.IP <CR> 12 +.IX Item "<CR>" +Repeat last \f(CW\*(C`n\*(C'\fR or \f(CW\*(C`s\*(C'\fR command. +.IP "c [line|sub]" 12 +.IX Xref "debugger command, c" +.IX Item "c [line|sub]" +Continue, optionally inserting a one-time-only breakpoint +at the specified line or subroutine. +.IP l 12 +.IX Xref "debugger command, l" +.IX Item "l" +List next window of lines. +.IP "l min+incr" 12 +.IX Item "l min+incr" +List \f(CW\*(C`incr+1\*(C'\fR lines starting at \f(CW\*(C`min\*(C'\fR. +.IP "l min-max" 12 +.IX Item "l min-max" +List lines \f(CW\*(C`min\*(C'\fR through \f(CW\*(C`max\*(C'\fR. \f(CW\*(C`l \-\*(C'\fR is synonymous to \f(CW\*(C`\-\*(C'\fR. +.IP "l line" 12 +.IX Item "l line" +List a single line. +.IP "l subname" 12 +.IX Item "l subname" +List first window of lines from subroutine. \fIsubname\fR may +be a variable that contains a code reference. +.IP \- 12 +.IX Xref "debugger command, -" +List previous window of lines. +.IP "v [line]" 12 +.IX Xref "debugger command, v" +.IX Item "v [line]" +View a few lines of code around the current line. +.IP . 12 +.IX Xref "debugger command, ." +Return the internal debugger pointer to the line last +executed, and print out that line. +.IP "f filename" 12 +.IX Xref "debugger command, f" +.IX Item "f filename" +Switch to viewing a different file or \f(CW\*(C`eval\*(C'\fR statement. If \fIfilename\fR +is not a full pathname found in the values of \f(CW%INC\fR, it is considered +a regex. +.Sp +\&\f(CW\*(C`eval\*(C'\fRed strings (when accessible) are considered to be filenames: +\&\f(CW\*(C`f (eval 7)\*(C'\fR and \f(CW\*(C`f eval 7\eb\*(C'\fR access the body of the 7th \f(CW\*(C`eval\*(C'\fRed string +(in the order of execution). The bodies of the currently executed \f(CW\*(C`eval\*(C'\fR +and of \f(CW\*(C`eval\*(C'\fRed strings that define subroutines are saved and thus +accessible. +.IP /pattern/ 12 +.IX Item "/pattern/" +Search forwards for pattern (a Perl regex); final / is optional. +The search is case-insensitive by default. +.IP ?pattern? 12 +.IX Item "?pattern?" +Search backwards for pattern; final ? is optional. +The search is case-insensitive by default. +.IP "L [abw]" 12 +.IX Xref "debugger command, L" +.IX Item "L [abw]" +List (default all) actions, breakpoints and watch expressions +.IP "S [[!]regex]" 12 +.IX Xref "debugger command, S" +.IX Item "S [[!]regex]" +List subroutine names [not] matching the regex. +.IP "t [n]" 12 +.IX Xref "debugger command, t" +.IX Item "t [n]" +Toggle trace mode (see also the \f(CW\*(C`AutoTrace\*(C'\fR option). +Optional argument is the maximum number of levels to trace below +the current one; anything deeper than that will be silent. +.IP "t [n] expr" 12 +.IX Xref "debugger command, t" +.IX Item "t [n] expr" +Trace through execution of \f(CW\*(C`expr\*(C'\fR. +Optional first argument is the maximum number of levels to trace below +the current one; anything deeper than that will be silent. +See "Frame Listing Output Examples" in perldebguts for examples. +.IP b 12 +.IX Xref "breakpoint debugger command, b" +.IX Item "b" +Sets breakpoint on current line +.IP "b [line] [condition]" 12 +.IX Xref "breakpoint debugger command, b" +.IX Item "b [line] [condition]" +Set a breakpoint before the given line. If a condition +is specified, it's evaluated each time the statement is reached: a +breakpoint is taken only if the condition is true. Breakpoints may +only be set on lines that begin an executable statement. Conditions +don't use \f(CW\*(C`if\*(C'\fR: +.Sp +.Vb 3 +\& b 237 $x > 30 +\& b 237 ++$count237 < 11 +\& b 33 /pattern/i +.Ve +.Sp +If the line number is \f(CW\*(C`.\*(C'\fR, sets a breakpoint on the current line: +.Sp +.Vb 1 +\& b . $n > 100 +.Ve +.IP "b [file]:[line] [condition]" 12 +.IX Xref "breakpoint debugger command, b" +.IX Item "b [file]:[line] [condition]" +Set a breakpoint before the given line in a (possibly different) file. If a +condition is specified, it's evaluated each time the statement is reached: a +breakpoint is taken only if the condition is true. Breakpoints may only be set +on lines that begin an executable statement. Conditions don't use \f(CW\*(C`if\*(C'\fR: +.Sp +.Vb 2 +\& b lib/MyModule.pm:237 $x > 30 +\& b /usr/lib/perl5/site_perl/CGI.pm:100 ++$count100 < 11 +.Ve +.IP "b subname [condition]" 12 +.IX Xref "breakpoint debugger command, b" +.IX Item "b subname [condition]" +Set a breakpoint before the first line of the named subroutine. \fIsubname\fR may +be a variable containing a code reference (in this case \fIcondition\fR +is not supported). +.IP "b postpone subname [condition]" 12 +.IX Xref "breakpoint debugger command, b" +.IX Item "b postpone subname [condition]" +Set a breakpoint at first line of subroutine after it is compiled. +.IP "b load filename" 12 +.IX Xref "breakpoint debugger command, b" +.IX Item "b load filename" +Set a breakpoint before the first executed line of the \fIfilename\fR, +which should be a full pathname found amongst the \f(CW%INC\fR values. +.IP "b compile subname" 12 +.IX Xref "breakpoint debugger command, b" +.IX Item "b compile subname" +Sets a breakpoint before the first statement executed after the specified +subroutine is compiled. +.IP "B line" 12 +.IX Xref "breakpoint debugger command, B" +.IX Item "B line" +Delete a breakpoint from the specified \fIline\fR. +.IP "B *" 12 +.IX Xref "breakpoint debugger command, B" +.IX Item "B *" +Delete all installed breakpoints. +.IP "disable [file]:[line]" 12 +.IX Xref "breakpoint debugger command, disable disable" +.IX Item "disable [file]:[line]" +Disable the breakpoint so it won't stop the execution of the program. +Breakpoints are enabled by default and can be re-enabled using the \f(CW\*(C`enable\*(C'\fR +command. +.IP "disable [line]" 12 +.IX Xref "breakpoint debugger command, disable disable" +.IX Item "disable [line]" +Disable the breakpoint so it won't stop the execution of the program. +Breakpoints are enabled by default and can be re-enabled using the \f(CW\*(C`enable\*(C'\fR +command. +.Sp +This is done for a breakpoint in the current file. +.IP "enable [file]:[line]" 12 +.IX Xref "breakpoint debugger command, disable disable" +.IX Item "enable [file]:[line]" +Enable the breakpoint so it will stop the execution of the program. +.IP "enable [line]" 12 +.IX Xref "breakpoint debugger command, disable disable" +.IX Item "enable [line]" +Enable the breakpoint so it will stop the execution of the program. +.Sp +This is done for a breakpoint in the current file. +.IP "a [line] command" 12 +.IX Xref "debugger command, a" +.IX Item "a [line] command" +Set an action to be done before the line is executed. If \fIline\fR is +omitted, set an action on the line about to be executed. +The sequence of steps taken by the debugger is +.Sp +.Vb 5 +\& 1. check for a breakpoint at this line +\& 2. print the line if necessary (tracing) +\& 3. do any actions associated with that line +\& 4. prompt user if at a breakpoint or in single\-step +\& 5. evaluate line +.Ve +.Sp +For example, this will print out \f(CW$foo\fR every time line +53 is passed: +.Sp +.Vb 1 +\& a 53 print "DB FOUND $foo\en" +.Ve +.IP "A line" 12 +.IX Xref "debugger command, A" +.IX Item "A line" +Delete an action from the specified line. +.IP "A *" 12 +.IX Xref "debugger command, A" +.IX Item "A *" +Delete all installed actions. +.IP "w expr" 12 +.IX Xref "debugger command, w" +.IX Item "w expr" +Add a global watch-expression. Whenever a watched global changes the +debugger will stop and display the old and new values. +.IP "W expr" 12 +.IX Xref "debugger command, W" +.IX Item "W expr" +Delete watch-expression +.IP "W *" 12 +.IX Xref "debugger command, W" +.IX Item "W *" +Delete all watch-expressions. +.IP o 12 +.IX Xref "debugger command, o" +.IX Item "o" +Display all options. +.IP "o booloption ..." 12 +.IX Xref "debugger command, o" +.IX Item "o booloption ..." +Set each listed Boolean option to the value \f(CW1\fR. +.IP "o anyoption? ..." 12 +.IX Xref "debugger command, o" +.IX Item "o anyoption? ..." +Print out the value of one or more options. +.IP "o option=value ..." 12 +.IX Xref "debugger command, o" +.IX Item "o option=value ..." +Set the value of one or more options. If the value has internal +whitespace, it should be quoted. For example, you could set \f(CW\*(C`o +pager="less \-MQeicsNfr"\*(C'\fR to call \fBless\fR with those specific options. +You may use either single or double quotes, but if you do, you must +escape any embedded instances of same sort of quote you began with, +as well as any escaping any escapes that immediately precede that +quote but which are not meant to escape the quote itself. In other +words, you follow single-quoting rules irrespective of the quote; +eg: \f(CW\*(C`o option=\*(Aqthis isn\e\*(Aqt bad\*(Aq\*(C'\fR or \f(CW\*(C`o option="She said, \e"Isn\*(Aqt +it?\e""\*(C'\fR. +.Sp +For historical reasons, the \f(CW\*(C`=value\*(C'\fR is optional, but defaults to +1 only where it is safe to do so\-\-that is, mostly for Boolean +options. It is always better to assign a specific value using \f(CW\*(C`=\*(C'\fR. +The \f(CW\*(C`option\*(C'\fR can be abbreviated, but for clarity probably should +not be. Several options can be set together. See "Configurable Options" +for a list of these. +.IP "< ?" 12 +.IX Xref "debugger command, <" +List out all pre-prompt Perl command actions. +.IP "< [ command ]" 12 +.IX Xref "debugger command, <" +.IX Item "< [ command ]" +Set an action (Perl command) to happen before every debugger prompt. +A multi-line command may be entered by backslashing the newlines. +.IP "< *" 12 +.IX Xref "debugger command, <" +Delete all pre-prompt Perl command actions. +.IP "<< command" 12 +.IX Xref "debugger command, <<" +.IX Item "<< command" +Add an action (Perl command) to happen before every debugger prompt. +A multi-line command may be entered by backwhacking the newlines. +.IP "> ?" 12 +.IX Xref "debugger command, >" +List out post-prompt Perl command actions. +.IP "> command" 12 +.IX Xref "debugger command, >" +.IX Item "> command" +Set an action (Perl command) to happen after the prompt when you've +just given a command to return to executing the script. A multi-line +command may be entered by backslashing the newlines (we bet you +couldn't have guessed this by now). +.IP "> *" 12 +.IX Xref "debugger command, >" +Delete all post-prompt Perl command actions. +.IP ">> command" 12 +.IX Xref "debugger command, >>" +.IX Item ">> command" +Adds an action (Perl command) to happen after the prompt when you've +just given a command to return to executing the script. A multi-line +command may be entered by backslashing the newlines. +.IP "{ ?" 12 +.IX Xref "debugger command, {" +List out pre-prompt debugger commands. +.IP "{ [ command ]" 12 +.IX Item "{ [ command ]" +Set an action (debugger command) to happen before every debugger prompt. +A multi-line command may be entered in the customary fashion. +.Sp +Because this command is in some senses new, a warning is issued if +you appear to have accidentally entered a block instead. If that's +what you mean to do, write it as with \f(CW\*(C`;{ ... }\*(C'\fR or even +\&\f(CW\*(C`do { ... }\*(C'\fR. +.IP "{ *" 12 +.IX Xref "debugger command, {" +Delete all pre-prompt debugger commands. +.IP "{{ command" 12 +.IX Xref "debugger command, {{" +.IX Item "{{ command" +Add an action (debugger command) to happen before every debugger prompt. +A multi-line command may be entered, if you can guess how: see above. +.IP "! number" 12 +.IX Xref "debugger command, !" +.IX Item "! number" +Redo a previous command (defaults to the previous command). +.IP "! \-number" 12 +.IX Xref "debugger command, !" +.IX Item "! -number" +Redo number'th previous command. +.IP "! pattern" 12 +.IX Xref "debugger command, !" +.IX Item "! pattern" +Redo last command that started with pattern. +See \f(CW\*(C`o\ recallCommand\*(C'\fR, too. +.IP "!! cmd" 12 +.IX Xref "debugger command, !!" +.IX Item "!! cmd" +Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT) See +\&\f(CW\*(C`o\ shellBang\*(C'\fR, also. Note that the user's current shell (well, +their \f(CW$ENV{SHELL}\fR variable) will be used, which can interfere +with proper interpretation of exit status or signal and coredump +information. +.IP "source file" 12 +.IX Xref "debugger command, source" +.IX Item "source file" +Read and execute debugger commands from \fIfile\fR. +\&\fIfile\fR may itself contain \f(CW\*(C`source\*(C'\fR commands. +.IP "H \-number" 12 +.IX Xref "debugger command, H" +.IX Item "H -number" +Display last n commands. Only commands longer than one character are +listed. If \fInumber\fR is omitted, list them all. +.IP "q or ^D" 12 +.IX Xref "debugger command, q debugger command, ^D" +.IX Item "q or ^D" +Quit. ("quit" doesn't work for this, unless you've made an alias) +This is the only supported way to exit the debugger, though typing +\&\f(CW\*(C`exit\*(C'\fR twice might work. +.Sp +Set the \f(CW\*(C`inhibit_exit\*(C'\fR option to 0 if you want to be able to step +off the end the script. You may also need to set \f(CW$finished\fR to 0 +if you want to step through global destruction. +.IP R 12 +.IX Xref "debugger command, R" +.IX Item "R" +Restart the debugger by \f(CWexec()\fRing a new session. We try to maintain +your history across this, but internal settings and command-line options +may be lost. +.Sp +The following setting are currently preserved: history, breakpoints, +actions, debugger options, and the Perl command-line +options \fB\-w\fR, \fB\-I\fR, and \fB\-e\fR. +.IP |dbcmd 12 +.IX Xref "debugger command, |" +.IX Item "|dbcmd" +Run the debugger command, piping DB::OUT into your current pager. +.IP ||dbcmd 12 +.IX Xref "debugger command, ||" +.IX Item "||dbcmd" +Same as \f(CW\*(C`|dbcmd\*(C'\fR but DB::OUT is temporarily \f(CW\*(C`select\*(C'\fRed as well. +.IP "= [alias value]" 12 +.IX Xref "debugger command, =" +.IX Item "= [alias value]" +Define a command alias, like +.Sp +.Vb 1 +\& = quit q +.Ve +.Sp +or list current aliases. +.IP command 12 +.IX Item "command" +Execute command as a Perl statement. A trailing semicolon will be +supplied. If the Perl statement would otherwise be confused for a +Perl debugger, use a leading semicolon, too. +.IP "m expr" 12 +.IX Xref "debugger command, m" +.IX Item "m expr" +List which methods may be called on the result of the evaluated +expression. The expression may evaluated to a reference to a +blessed object, or to a package name. +.IP M 12 +.IX Xref "debugger command, M" +.IX Item "M" +Display all loaded modules and their versions. +.IP "man [manpage]" 12 +.IX Xref "debugger command, man" +.IX Item "man [manpage]" +Despite its name, this calls your system's default documentation +viewer on the given page, or on the viewer itself if \fImanpage\fR is +omitted. If that viewer is \fBman\fR, the current \f(CW\*(C`Config\*(C'\fR information +is used to invoke \fBman\fR using the proper MANPATH or \fB\-M\fR\ \fImanpath\fR option. Failed lookups of the form \f(CW\*(C`XXX\*(C'\fR that match +known manpages of the form \fIperlXXX\fR will be retried. This lets +you type \f(CW\*(C`man debug\*(C'\fR or \f(CW\*(C`man op\*(C'\fR from the debugger. +.Sp +On systems traditionally bereft of a usable \fBman\fR command, the +debugger invokes \fBperldoc\fR. Occasionally this determination is +incorrect due to recalcitrant vendors or rather more felicitously, +to enterprising users. If you fall into either category, just +manually set the \f(CW$DB::doccmd\fR variable to whatever viewer to view +the Perl documentation on your system. This may be set in an rc +file, or through direct assignment. We're still waiting for a +working example of something along the lines of: +.Sp +.Vb 1 +\& $DB::doccmd = \*(Aqnetscape \-remote http://something.here/\*(Aq; +.Ve +.SS "Configurable Options" +.IX Subsection "Configurable Options" +The debugger has numerous options settable using the \f(CW\*(C`o\*(C'\fR command, +either interactively or from the environment or an rc file. The file +is named \fI./.perldb\fR or \fI~/.perldb\fR under Unix with \fI/dev/tty\fR, +\&\fIperldb.ini\fR otherwise. +.ie n .IP """recallCommand"", ""ShellBang""" 12 +.el .IP "\f(CWrecallCommand\fR, \f(CWShellBang\fR" 12 +.IX Xref "debugger option, recallCommand debugger option, ShellBang" +.IX Item "recallCommand, ShellBang" +The characters used to recall a command or spawn a shell. By +default, both are set to \f(CW\*(C`!\*(C'\fR, which is unfortunate. +.ie n .IP """pager""" 12 +.el .IP \f(CWpager\fR 12 +.IX Xref "debugger option, pager" +.IX Item "pager" +Program to use for output of pager-piped commands (those beginning +with a \f(CW\*(C`|\*(C'\fR character.) By default, \f(CW$ENV{PAGER}\fR will be used. +Because the debugger uses your current terminal characteristics +for bold and underlining, if the chosen pager does not pass escape +sequences through unchanged, the output of some debugger commands +will not be readable when sent through the pager. +.ie n .IP """tkRunning""" 12 +.el .IP \f(CWtkRunning\fR 12 +.IX Xref "debugger option, tkRunning" +.IX Item "tkRunning" +Run Tk while prompting (with ReadLine). +.ie n .IP """signalLevel"", ""warnLevel"", ""dieLevel""" 12 +.el .IP "\f(CWsignalLevel\fR, \f(CWwarnLevel\fR, \f(CWdieLevel\fR" 12 +.IX Xref "debugger option, signalLevel debugger option, warnLevel debugger option, dieLevel" +.IX Item "signalLevel, warnLevel, dieLevel" +Level of verbosity. By default, the debugger leaves your exceptions +and warnings alone, because altering them can break correctly running +programs. It will attempt to print a message when uncaught INT, BUS, or +SEGV signals arrive. (But see the mention of signals in "BUGS" below.) +.Sp +To disable this default safe mode, set these values to something higher +than 0. At a level of 1, you get backtraces upon receiving any kind +of warning (this is often annoying) or exception (this is +often valuable). Unfortunately, the debugger cannot discern fatal +exceptions from non-fatal ones. If \f(CW\*(C`dieLevel\*(C'\fR is even 1, then your +non-fatal exceptions are also traced and unceremoniously altered if they +came from \f(CW\*(C`eval\*(Aqed\*(C'\fR strings or from any kind of \f(CW\*(C`eval\*(C'\fR within modules +you're attempting to load. If \f(CW\*(C`dieLevel\*(C'\fR is 2, the debugger doesn't +care where they came from: It usurps your exception handler and prints +out a trace, then modifies all exceptions with its own embellishments. +This may perhaps be useful for some tracing purposes, but tends to hopelessly +destroy any program that takes its exception handling seriously. +.ie n .IP """AutoTrace""" 12 +.el .IP \f(CWAutoTrace\fR 12 +.IX Xref "debugger option, AutoTrace" +.IX Item "AutoTrace" +Trace mode (similar to \f(CW\*(C`t\*(C'\fR command, but can be put into +\&\f(CW\*(C`PERLDB_OPTS\*(C'\fR). +.ie n .IP """LineInfo""" 12 +.el .IP \f(CWLineInfo\fR 12 +.IX Xref "debugger option, LineInfo" +.IX Item "LineInfo" +File or pipe to print line number info to. If it is a pipe (say, +\&\f(CW\*(C`|visual_perl_db\*(C'\fR), then a short message is used. This is the +mechanism used to interact with a client editor or visual debugger, +such as the special \f(CW\*(C`vi\*(C'\fR or \f(CW\*(C`emacs\*(C'\fR hooks, or the \f(CW\*(C`ddd\*(C'\fR graphical +debugger. +.ie n .IP """inhibit_exit""" 12 +.el .IP \f(CWinhibit_exit\fR 12 +.IX Xref "debugger option, inhibit_exit" +.IX Item "inhibit_exit" +If 0, allows \fIstepping off\fR the end of the script. +.ie n .IP """PrintRet""" 12 +.el .IP \f(CWPrintRet\fR 12 +.IX Xref "debugger option, PrintRet" +.IX Item "PrintRet" +Print return value after \f(CW\*(C`r\*(C'\fR command if set (default). +.ie n .IP """ornaments""" 12 +.el .IP \f(CWornaments\fR 12 +.IX Xref "debugger option, ornaments" +.IX Item "ornaments" +Affects screen appearance of the command line (see Term::ReadLine). +There is currently no way to disable these, which can render +some output illegible on some displays, or with some pagers. +This is considered a bug. +.ie n .IP """frame""" 12 +.el .IP \f(CWframe\fR 12 +.IX Xref "debugger option, frame" +.IX Item "frame" +Affects the printing of messages upon entry and exit from subroutines. If +\&\f(CW\*(C`frame & 2\*(C'\fR is false, messages are printed on entry only. (Printing +on exit might be useful if interspersed with other messages.) +.Sp +If \f(CW\*(C`frame & 4\*(C'\fR, arguments to functions are printed, plus context +and caller info. If \f(CW\*(C`frame & 8\*(C'\fR, overloaded \f(CW\*(C`stringify\*(C'\fR and +\&\f(CW\*(C`tie\*(C'\fRd \f(CW\*(C`FETCH\*(C'\fR is enabled on the printed arguments. If \f(CW\*(C`frame +& 16\*(C'\fR, the return value from the subroutine is printed. +.Sp +The length at which the argument list is truncated is governed by the +next option: +.ie n .IP """maxTraceLen""" 12 +.el .IP \f(CWmaxTraceLen\fR 12 +.IX Xref "debugger option, maxTraceLen" +.IX Item "maxTraceLen" +Length to truncate the argument list when the \f(CW\*(C`frame\*(C'\fR option's +bit 4 is set. +.ie n .IP """windowSize""" 12 +.el .IP \f(CWwindowSize\fR 12 +.IX Xref "debugger option, windowSize" +.IX Item "windowSize" +Change the size of code list window (default is 10 lines). +.PP +The following options affect what happens with \f(CW\*(C`V\*(C'\fR, \f(CW\*(C`X\*(C'\fR, and \f(CW\*(C`x\*(C'\fR +commands: +.ie n .IP """arrayDepth"", ""hashDepth""" 12 +.el .IP "\f(CWarrayDepth\fR, \f(CWhashDepth\fR" 12 +.IX Xref "debugger option, arrayDepth debugger option, hashDepth" +.IX Item "arrayDepth, hashDepth" +Print only first N elements ('' for all). +.ie n .IP """dumpDepth""" 12 +.el .IP \f(CWdumpDepth\fR 12 +.IX Xref "debugger option, dumpDepth" +.IX Item "dumpDepth" +Limit recursion depth to N levels when dumping structures. +Negative values are interpreted as infinity. Default: infinity. +.ie n .IP """compactDump"", ""veryCompact""" 12 +.el .IP "\f(CWcompactDump\fR, \f(CWveryCompact\fR" 12 +.IX Xref "debugger option, compactDump debugger option, veryCompact" +.IX Item "compactDump, veryCompact" +Change the style of array and hash output. If \f(CW\*(C`compactDump\*(C'\fR, short array +may be printed on one line. +.ie n .IP """globPrint""" 12 +.el .IP \f(CWglobPrint\fR 12 +.IX Xref "debugger option, globPrint" +.IX Item "globPrint" +Whether to print contents of globs. +.ie n .IP """DumpDBFiles""" 12 +.el .IP \f(CWDumpDBFiles\fR 12 +.IX Xref "debugger option, DumpDBFiles" +.IX Item "DumpDBFiles" +Dump arrays holding debugged files. +.ie n .IP """DumpPackages""" 12 +.el .IP \f(CWDumpPackages\fR 12 +.IX Xref "debugger option, DumpPackages" +.IX Item "DumpPackages" +Dump symbol tables of packages. +.ie n .IP """DumpReused""" 12 +.el .IP \f(CWDumpReused\fR 12 +.IX Xref "debugger option, DumpReused" +.IX Item "DumpReused" +Dump contents of "reused" addresses. +.ie n .IP """quote"", ""HighBit"", ""undefPrint""" 12 +.el .IP "\f(CWquote\fR, \f(CWHighBit\fR, \f(CWundefPrint\fR" 12 +.IX Xref "debugger option, quote debugger option, HighBit debugger option, undefPrint" +.IX Item "quote, HighBit, undefPrint" +Change the style of string dump. The default value for \f(CW\*(C`quote\*(C'\fR +is \f(CW\*(C`auto\*(C'\fR; one can enable double-quotish or single-quotish format +by setting it to \f(CW\*(C`"\*(C'\fR or \f(CW\*(C`\*(Aq\*(C'\fR, respectively. By default, characters +with their high bit set are printed verbatim. +.ie n .IP """UsageOnly""" 12 +.el .IP \f(CWUsageOnly\fR 12 +.IX Xref "debugger option, UsageOnly" +.IX Item "UsageOnly" +Rudimentary per-package memory usage dump. Calculates total +size of strings found in variables in the package. This does not +include lexicals in a module's file scope, or lost in closures. +.ie n .IP """HistFile""" 12 +.el .IP \f(CWHistFile\fR 12 +.IX Xref "debugger option, history, HistFile" +.IX Item "HistFile" +The path of the file from which the history (assuming a usable +Term::ReadLine backend) will be read on the debugger's startup, and to which +it will be saved on shutdown (for persistence across sessions). Similar in +concept to Bash's \f(CW\*(C`.bash_history\*(C'\fR file. +.ie n .IP """HistSize""" 12 +.el .IP \f(CWHistSize\fR 12 +.IX Xref "debugger option, history, HistSize" +.IX Item "HistSize" +The count of the saved lines in the history (assuming \f(CW\*(C`HistFile\*(C'\fR above). +.PP +After the rc file is read, the debugger reads the \f(CW$ENV{PERLDB_OPTS}\fR +environment variable and parses this as the remainder of a "O ..." +line as one might enter at the debugger prompt. You may place the +initialization options \f(CW\*(C`TTY\*(C'\fR, \f(CW\*(C`noTTY\*(C'\fR, \f(CW\*(C`ReadLine\*(C'\fR, and \f(CW\*(C`NonStop\*(C'\fR +there. +.PP +If your rc file contains: +.PP +.Vb 1 +\& parse_options("NonStop=1 LineInfo=db.out AutoTrace"); +.Ve +.PP +then your script will run without human intervention, putting trace +information into the file \fIdb.out\fR. (If you interrupt it, you'd +better reset \f(CW\*(C`LineInfo\*(C'\fR to \fI/dev/tty\fR if you expect to see anything.) +.ie n .IP """TTY""" 12 +.el .IP \f(CWTTY\fR 12 +.IX Xref "debugger option, TTY" +.IX Item "TTY" +The TTY to use for debugging I/O. +.ie n .IP """noTTY""" 12 +.el .IP \f(CWnoTTY\fR 12 +.IX Xref "debugger option, noTTY" +.IX Item "noTTY" +If set, the debugger goes into \f(CW\*(C`NonStop\*(C'\fR mode and will not connect to a TTY. If +interrupted (or if control goes to the debugger via explicit setting of +\&\f(CW$DB::signal\fR or \f(CW$DB::single\fR from the Perl script), it connects to a TTY +specified in the \f(CW\*(C`TTY\*(C'\fR option at startup, or to a tty found at +runtime using the \f(CW\*(C`Term::Rendezvous\*(C'\fR module of your choice. +.Sp +This module should implement a method named \f(CW\*(C`new\*(C'\fR that returns an object +with two methods: \f(CW\*(C`IN\*(C'\fR and \f(CW\*(C`OUT\*(C'\fR. These should return filehandles to use +for debugging input and output correspondingly. The \f(CW\*(C`new\*(C'\fR method should +inspect an argument containing the value of \f(CW$ENV{PERLDB_NOTTY}\fR at +startup, or \f(CW"$ENV{HOME}/.perldbtty$$"\fR otherwise. This file is not +inspected for proper ownership, so security hazards are theoretically +possible. +.ie n .IP """ReadLine""" 12 +.el .IP \f(CWReadLine\fR 12 +.IX Xref "debugger option, ReadLine" +.IX Item "ReadLine" +If false, readline support in the debugger is disabled in order +to debug applications that themselves use ReadLine. +.ie n .IP """NonStop""" 12 +.el .IP \f(CWNonStop\fR 12 +.IX Xref "debugger option, NonStop" +.IX Item "NonStop" +If set, the debugger goes into non-interactive mode until interrupted, or +programmatically by setting \f(CW$DB::signal\fR or \f(CW$DB::single\fR. +.PP +Here's an example of using the \f(CW$ENV{PERLDB_OPTS}\fR variable: +.PP +.Vb 1 +\& $ PERLDB_OPTS="NonStop frame=2" perl \-d myprogram +.Ve +.PP +That will run the script \fBmyprogram\fR without human intervention, +printing out the call tree with entry and exit points. Note that +\&\f(CW\*(C`NonStop=1 frame=2\*(C'\fR is equivalent to \f(CW\*(C`N f=2\*(C'\fR, and that originally, +options could be uniquely abbreviated by the first letter (modulo +the \f(CW\*(C`Dump*\*(C'\fR options). It is nevertheless recommended that you +always spell them out in full for legibility and future compatibility. +.PP +Other examples include +.PP +.Vb 1 +\& $ PERLDB_OPTS="NonStop LineInfo=listing frame=2" perl \-d myprogram +.Ve +.PP +which runs script non-interactively, printing info on each entry +into a subroutine and each executed line into the file named \fIlisting\fR. +(If you interrupt it, you would better reset \f(CW\*(C`LineInfo\*(C'\fR to something +"interactive"!) +.PP +Other examples include (using standard shell syntax to show environment +variable settings): +.PP +.Vb 2 +\& $ ( PERLDB_OPTS="NonStop frame=1 AutoTrace LineInfo=tperl.out" +\& perl \-d myprogram ) +.Ve +.PP +which may be useful for debugging a program that uses Term::ReadLine +itself. Do not forget to detach your shell from the TTY in the window that +corresponds to \fI/dev/ttyXX\fR, say, by issuing a command like +.PP +.Vb 1 +\& $ sleep 1000000 +.Ve +.PP +See "Debugger Internals" in perldebguts for details. +.SS "Debugger Input/Output" +.IX Subsection "Debugger Input/Output" +.IP Prompt 8 +.IX Item "Prompt" +The debugger prompt is something like +.Sp +.Vb 1 +\& DB<8> +.Ve +.Sp +or even +.Sp +.Vb 1 +\& DB<<17>> +.Ve +.Sp +where that number is the command number, and which you'd use to +access with the built-in \fBcsh\fR\-like history mechanism. For example, +\&\f(CW\*(C`!17\*(C'\fR would repeat command number 17. The depth of the angle +brackets indicates the nesting 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 the result of a function call that +itself has a breakpoint, or you step into an expression via \f(CW\*(C`s/n/t +expression\*(C'\fR command. +.IP "Multiline commands" 8 +.IX Item "Multiline commands" +If you want to enter a multi-line command, such as a subroutine +definition with several statements or a format, escape the newline +that would normally end the debugger command with a backslash. +Here's an example: +.Sp +.Vb 7 +\& DB<1> for (1..4) { \e +\& cont: print "ok\en"; \e +\& cont: } +\& ok +\& ok +\& ok +\& ok +.Ve +.Sp +Note that this business of escaping a newline is specific to interactive +commands typed into the debugger. +.IP "Stack backtrace" 8 +.IX Xref "backtrace stack, backtrace" +.IX Item "Stack backtrace" +Here's an example of what a stack backtrace via \f(CW\*(C`T\*(C'\fR command might +look like: +.Sp +.Vb 5 +\& $ = main::infested called from file \*(AqAmbulation.pm\*(Aq line 10 +\& @ = Ambulation::legs(1, 2, 3, 4) called from file \*(Aqcamel_flea\*(Aq +\& line 7 +\& $ = main::pests(\*(Aqbactrian\*(Aq, 4) called from file \*(Aqcamel_flea\*(Aq +\& line 4 +.Ve +.Sp +The left-hand character up there indicates the context in which the +function was called, with \f(CW\*(C`$\*(C'\fR and \f(CW\*(C`@\*(C'\fR meaning scalar or list +contexts respectively, and \f(CW\*(C`.\*(C'\fR meaning void context (which is +actually a sort of scalar context). The display above says +that you were in the function \f(CW\*(C`main::infested\*(C'\fR when you ran the +stack dump, and that it was called in scalar context from line +10 of the file \fIAmbulation.pm\fR, but without any arguments at all, +meaning it was called as \f(CW&infested\fR. The next stack frame shows +that the function \f(CW\*(C`Ambulation::legs\*(C'\fR was called in list context +from the \fIcamel_flea\fR file with four arguments. The last stack +frame shows that \f(CW\*(C`main::pests\*(C'\fR was called in scalar context, +also from \fIcamel_flea\fR, but from line 4. +.Sp +If you execute the \f(CW\*(C`T\*(C'\fR command from inside an active \f(CW\*(C`use\*(C'\fR +statement, the backtrace will contain both a \f(CW\*(C`require\*(C'\fR frame and +an \f(CW\*(C`eval\*(C'\fR frame. +.IP "Line Listing Format" 8 +.IX Item "Line Listing Format" +This shows the sorts of output the \f(CW\*(C`l\*(C'\fR command can produce: +.Sp +.Vb 11 +\& DB<<13>> l +\& 101: @i{@i} = (); +\& 102:b @isa{@i,$pack} = () +\& 103 if(exists $i{$prevpack} || exists $isa{$pack}); +\& 104 } +\& 105 +\& 106 next +\& 107==> if(exists $isa{$pack}); +\& 108 +\& 109:a if ($extra\-\- > 0) { +\& 110: %isa = ($pack,1); +.Ve +.Sp +Breakable lines are marked with \f(CW\*(C`:\*(C'\fR. Lines with breakpoints are +marked by \f(CW\*(C`b\*(C'\fR and those with actions by \f(CW\*(C`a\*(C'\fR. The line that's +about to be executed is marked by \f(CW\*(C`==>\*(C'\fR. +.Sp +Please be aware that code in debugger listings may not look the same +as your original source code. Line directives and external source +filters can alter the code before Perl sees it, causing code to move +from its original positions or take on entirely different forms. +.IP "Frame listing" 8 +.IX Item "Frame listing" +When the \f(CW\*(C`frame\*(C'\fR option is set, the debugger would print entered (and +optionally exited) subroutines in different styles. See perldebguts +for incredibly long examples of these. +.SS "Debugging Compile-Time Statements" +.IX Subsection "Debugging Compile-Time Statements" +If you have compile-time executable statements (such as code within +BEGIN, UNITCHECK and CHECK blocks or \f(CW\*(C`use\*(C'\fR statements), these will +\&\fInot\fR be stopped by debugger, although \f(CW\*(C`require\*(C'\fRs and INIT blocks +will, and compile-time statements can be traced with the \f(CW\*(C`AutoTrace\*(C'\fR +option set in \f(CW\*(C`PERLDB_OPTS\*(C'\fR). 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: +.PP +.Vb 1 +\& $DB::single = 1; +.Ve +.PP +If you set \f(CW$DB::single\fR to 2, it's equivalent to having +just typed the \f(CW\*(C`n\*(C'\fR command, whereas a value of 1 means the \f(CW\*(C`s\*(C'\fR +command. The \f(CW$DB::trace\fR variable should be set to 1 to simulate +having typed the \f(CW\*(C`t\*(C'\fR command. +.PP +Another way to debug compile-time code is to start the debugger, set a +breakpoint on the \fIload\fR of some module: +.PP +.Vb 2 +\& DB<7> b load f:/perllib/lib/Carp.pm +\& Will stop on load of \*(Aqf:/perllib/lib/Carp.pm\*(Aq. +.Ve +.PP +and then restart the debugger using the \f(CW\*(C`R\*(C'\fR command (if possible). One can use \f(CW\*(C`b +compile subname\*(C'\fR for the same purpose. +.SS "Debugger Customization" +.IX Subsection "Debugger Customization" +The debugger probably contains enough configuration hooks that you +won't ever have to modify it yourself. You may change the behaviour +of the debugger from within the debugger using its \f(CW\*(C`o\*(C'\fR command, from +the command line via the \f(CW\*(C`PERLDB_OPTS\*(C'\fR environment variable, and +from customization files. +.PP +You can do some customization by setting up a \fI.perldb\fR file, which +contains initialization code. For instance, you could make aliases +like these (the last one is one people expect to be there): +.PP +.Vb 4 +\& $DB::alias{\*(Aqlen\*(Aq} = \*(Aqs/^len(.*)/p length($1)/\*(Aq; +\& $DB::alias{\*(Aqstop\*(Aq} = \*(Aqs/^stop (at|in)/b/\*(Aq; +\& $DB::alias{\*(Aqps\*(Aq} = \*(Aqs/^ps\eb/p scalar /\*(Aq; +\& $DB::alias{\*(Aqquit\*(Aq} = \*(Aqs/^quit(\es*)/exit/\*(Aq; +.Ve +.PP +You can change options from \fI.perldb\fR by using calls like this one; +.PP +.Vb 1 +\& parse_options("NonStop=1 LineInfo=db.out AutoTrace=1 frame=2"); +.Ve +.PP +The code is executed in the package \f(CW\*(C`DB\*(C'\fR. Note that \fI.perldb\fR is +processed before processing \f(CW\*(C`PERLDB_OPTS\*(C'\fR. If \fI.perldb\fR defines the +subroutine \f(CW\*(C`afterinit\*(C'\fR, that function is called after debugger +initialization ends. \fI.perldb\fR may be contained in the current +directory, or in the home directory. Because this file is sourced +in by Perl and may contain arbitrary commands, for security reasons, +it must be owned by the superuser or the current user, and writable +by no one but its owner. +.PP +You can mock TTY input to debugger by adding arbitrary commands to +\&\f(CW@DB::typeahead\fR. For example, your \fI.perldb\fR file might contain: +.PP +.Vb 1 +\& sub afterinit { push @DB::typeahead, "b 4", "b 6"; } +.Ve +.PP +Which would attempt to set breakpoints on lines 4 and 6 immediately +after debugger initialization. Note that \f(CW@DB::typeahead\fR is not a supported +interface and is subject to change in future releases. +.PP +If you want to modify the debugger, copy \fIperl5db.pl\fR from the +Perl library to another name and hack it to your heart's content. +You'll then want to set your \f(CW\*(C`PERL5DB\*(C'\fR environment variable to say +something like this: +.PP +.Vb 1 +\& BEGIN { require "myperl5db.pl" } +.Ve +.PP +As a last resort, you could also use \f(CW\*(C`PERL5DB\*(C'\fR to customize the debugger +by directly setting internal variables or calling debugger functions. +.PP +Note that any variables and functions that are not documented in +this document (or in perldebguts) are considered for internal +use only, and as such are subject to change without notice. +.SS "Readline Support / History in the Debugger" +.IX Subsection "Readline Support / History in the Debugger" +As shipped, the only command-line history supplied is a simplistic one +that checks for leading exclamation points. However, if you install +the Term::ReadKey and Term::ReadLine modules from CPAN (such as +Term::ReadLine::Gnu, Term::ReadLine::Perl, ...) you will +have full editing capabilities much like those GNU \fIreadline\fR(3) provides. +Look for these in the \fImodules/by\-module/Term\fR directory on CPAN. +These do not support normal \fBvi\fR command-line editing, however. +.PP +A rudimentary command-line completion is also available, including +lexical variables in the current scope if the PadWalker module +is installed. +.PP +Without Readline support you may see the symbols "^[[A", "^[[C", "^[[B", +"^[[D"", "^H", ... when using the arrow keys and/or the backspace key. +.SS "Editor Support for Debugging" +.IX Subsection "Editor Support for Debugging" +If you have the GNU's version of \fBemacs\fR installed on your system, +it can interact with the Perl debugger to provide an integrated +software development environment reminiscent of its interactions +with C debuggers. +.PP +Recent versions of Emacs come with a +start file for making \fBemacs\fR act like a +syntax-directed editor that understands (some of) Perl's syntax. +See perlfaq3. +.PP +Users of \fBvi\fR should also look into \fBvim\fR and \fBgvim\fR, the mousey +and windy version, for coloring of Perl keywords. +.PP +Note that only perl can truly parse Perl, so all such CASE tools +fall somewhat short of the mark, especially if you don't program +your Perl as a C programmer might. +.SS "The Perl Profiler" +.IX Xref "profile profiling profiler" +.IX Subsection "The Perl Profiler" +If you wish to supply an alternative debugger for Perl to run, +invoke your script with a colon and a package argument given to the +\&\fB\-d\fR flag. Perl's alternative debuggers include a Perl profiler, +Devel::NYTProf, which is available separately as a CPAN +distribution. To profile your Perl program in the file \fImycode.pl\fR, +just type: +.PP +.Vb 1 +\& $ perl \-d:NYTProf mycode.pl +.Ve +.PP +When the script terminates the profiler will create a database of the +profile information that you can turn into reports using the profiler's +tools. See <perlperf> for details. +.SH "Debugging Regular Expressions" +.IX Xref "regular expression, debugging regex, debugging regexp, debugging" +.IX Header "Debugging Regular Expressions" +\&\f(CW\*(C`use re \*(Aqdebug\*(Aq\*(C'\fR enables you to see the gory details of how the Perl +regular expression engine works. In order to understand this typically +voluminous output, one must not only have some idea about how regular +expression matching works in general, but also know how Perl's regular +expressions are internally compiled into an automaton. These matters +are explored in some detail in +"Debugging Regular Expressions" in perldebguts. +.SH "Debugging Memory Usage" +.IX Xref "memory usage" +.IX Header "Debugging Memory Usage" +Perl contains internal support for reporting its own memory usage, +but this is a fairly advanced concept that requires some understanding +of how memory allocation works. +See "Debugging Perl Memory Usage" in perldebguts for the details. +.SH "SEE ALSO" +.IX Header "SEE ALSO" +You do have \f(CW\*(C`use strict\*(C'\fR and \f(CW\*(C`use warnings\*(C'\fR enabled, don't you? +.PP +perldebtut, +perldebguts, +perl5db.pl, +re, +DB, +Devel::NYTProf, +Dumpvalue, +and +perlrun. +.PP +When debugging a script that uses #! and is thus normally found in +\&\f(CW$PATH\fR, the \-S option causes perl to search \f(CW$PATH\fR for it, so you don't +have to type the path or \f(CW\*(C`which $scriptname\*(C'\fR. +.PP +.Vb 1 +\& $ perl \-Sd foo.pl +.Ve +.SH BUGS +.IX Header "BUGS" +You cannot get stack frame information or in any fashion debug functions +that were not compiled by Perl, such as those from C or C++ extensions. +.PP +If you alter your \f(CW@_\fR arguments in a subroutine (such as with \f(CW\*(C`shift\*(C'\fR +or \f(CW\*(C`pop\*(C'\fR), the stack backtrace will not show the original values. +.PP +The debugger does not currently work in conjunction with the \fB\-W\fR +command-line switch, because it itself is not free of warnings. +.PP +If you're in a slow syscall (like \f(CW\*(C`wait\*(C'\fRing, \f(CW\*(C`accept\*(C'\fRing, or \f(CW\*(C`read\*(C'\fRing +from your keyboard or a socket) and haven't set up your own \f(CW$SIG{INT}\fR +handler, then you won't be able to CTRL-C your way back to the debugger, +because the debugger's own \f(CW$SIG{INT}\fR handler doesn't understand that +it needs to raise an exception to \fBlongjmp\fR\|(3) out of slow syscalls. |