PERLDEBUG(1) — UNIX Programmer’s Manual
NAME
perldebug − Perl debugging
DESCRIPTION
First of all, have you tried using the −w switch?
Debugging
If you invoke Perl with a −d switch, your script will be run under the debugger. However, the Perl debugger is not a separate program as it is in a C environment. Instead, the −d flag tells the compiler to insert source information into the pseudocode it’s about to hand to the interpreter. (That means your code must 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. The program will halt before the first executable statement (but see below) and ask you for one of the following commands:
hPrints out a help message.
TStack trace. If you do bizarre things to your @_ arguments in a subroutine, the stack backtrace will not always show the original values.
sSingle step. Executes until it reaches the beginning of another statement.
nNext. Executes over subroutine calls, until it reaches the beginning of the next statement.
fFinish. Executes statements until it has finished the current subroutine.
cContinue. Executes until the next breakpoint is reached.
c lineContinue to the specified line. Inserts a one-time-only breakpoint at the specified line.
<CR>Repeat last n or s.
l min+incrList incr+1 lines starting at min. If min is omitted, starts where last listing left off. If incr is omitted, previous value of incr is used.
l min-maxList lines in the indicated range.
l lineList just the indicated line.
lList next window.
-List previous window.
w lineList window (a few lines worth of code) around line.
l subnameList subroutine. If it’s a long subroutine it just lists the beginning. Use “l” to list more.
/pattern/Regular expression search forward in the source code for pattern; the final / is optional.
?pattern?Regular expression search backward in the source code for pattern; the final ? is optional.
LList lines that have breakpoints or actions.
SLists the names of all subroutines.
tToggle trace mode on or off.
b line [ condition ]
Set a breakpoint. If line is omitted, sets a breakpoint on the line that is about to be executed. If a condition is specified, it is evaluated each time the statement is reached and 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 if:
b 237 $x > 30
b 33 /pattern/i
b subname [ condition ]
Set breakpoint at first executable line of subroutine.
d lineDelete breakpoint. If line is omitted, deletes the breakpoint on the line that is about to be executed.
DDelete all breakpoints.
a line command
Set an action for line. A multiline command may be entered by backslashing the newlines. This command is Perl code, not another debugger command.
ADelete all line actions.
< commandSet an action to happen before every debugger prompt. A multiline command may be entered by backslashing the newlines.
> commandSet an action to happen after the prompt when you’ve just given a command to return to executing the script. A multiline command may be entered by backslashing the newlines.
V package [symbols]
Display all (or some) variables in package (defaulting to the main package) 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 $) there, just the symbol names, like this:
V DB filename line
X [symbols]Same as as “V” command, but within the current package.
! numberRedo a debugging command. If number is omitted, redoes the previous command.
! −numberRedo the command that was that many commands ago.
H −numberDisplay last n commands. Only commands longer than one character are listed. If number is omitted, lists them all.
q or ^DQuit. ("quit” doesn’t work for this.)
commandExecute command as a Perl statement. A missing semicolon will be supplied.
p exprSame as print DB::OUT expr. The DB::OUT filehandle is opened to /dev/tty, regardless of where STDOUT may be redirected to.
Any command you type in that isn’t recognized by the debugger will be directly executed (eval’d) as Perl code. Leading white space will cause the debugger to think it’s NOT a debugger command.
If you have any compile-time executable statements (code within a BEGIN block or a use statement), these will NOT be stopped by debugger, although requires will. From your own code, however, you can transfer control back to the debugger using the following statement, which is harmless if the debugger is not running:
$DB::single = 1;
Customization
If you want to modify the debugger, copy perl5db.pl from the Perl library to another name and modify it as necessary. You’ll also want to set environment variable PERL5DB to say something like this:
BEGIN { require "myperl5db.pl" }
You can do some customization by setting up a .perldb file which contains initialization code. For instance, you could make aliases like these (the last one in particular most people seem to expect to be there):
$DB::alias{’len’} = ’s/^len(.∗)/p length($1)/’;
$DB::alias{’stop’} = ’s/^stop (at│in)/b/’;
$DB::alias{’.’} = ’s/^\./p ’
. ’"\$DB::sub(\$DB::filename:\$DB::line):\t"’
. ’,\$DB::dbline[\$DB::line]/’ ;
Other resources
You did try the −w switch, didn’t you?
BUGS
If your program exit()s or die()s, so does the debugger.
There’s no builtin way to restart the debugger without exiting and coming back into it. You could use an alias like this:
$DB::alias{’rerun’} = ’exec "perl -d $DB::filename"’;
But you’d lose any pending breakpoint information, and that might not be the right path, etc.
3rd Berkeley Distribution