Debugging

If you invoke perl with a -d switch, your script will be run under a debugging monitor. It will halt before the first executable statement and ask you for a command, such as:

 
h
Prints out a help message.
T
Stack trace.
s
Single step. Executes until it reaches the beginning of another statement.
n
Next. Executes over subroutine calls, until it reaches the beginning of the next statement.
f
Finish. Executes statements until it has finished the current subroutine.
c
Continue. Executes until the next breakpoint is reached.
c line
Continue to the specified line. Inserts a one-time-only breakpoint at the specified line.
<CR>
Repeat last n or s.
l min+incr
List 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-max
List lines in the indicated range.
l line
List just the indicated line.
l
List next window.
-
List previous window.
w line
List window around line.
l subname
List subroutine. If it's a long subroutine it just lists the beginning. Use "l" to list more.
/pattern/
Regular expression search forward for pattern; the final / is optional.
?pattern?
Regular expression search backward for pattern; the final ? is optional.
L
List lines that have breakpoints or actions.
S
Lists the names of all subroutines.
t
Toggle 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.
b subname condition
Set breakpoint at first executable line of subroutine.

<dt>d line

Delete breakpoint. If line is omitted, deletes the breakpoint on the line that is about to be executed.
D
Delete all breakpoints.
a line command
Set an action for line. A multi-line command may be entered by backslashing the newlines.
A
Delete all line actions.
< command
Set an action to happen before every debugger prompt. A multi-line command may be entered by backslashing the newlines.
> command
Set an action 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.
V package
List all variables in package. Default is main package.
! number
Redo a debugging command. If number is omitted, redoes the previous command.
! -number
Redo the command that was that many commands ago.
H -number
Display last n commands. Only commands longer than one character are listed. If number is omitted, lists them all.
q or ^D
Quit.
command
Execute command as a perl statement. A missing semicolon will be supplied.
p expr
Same as "print DB'OUT expr". The DB'OUT filehandle is opened to /dev/tty, regardless of where STDOUT may be redirected to.

If you want to modify the debugger, copy perldb.pl from the perl library to your current directory and modify it as necessary. (You'll also have to put -I. on your command line.) You can do some customization by setting up a .perldb file which contains initialization code. For instance, you could make aliases like these:


    $DB'alias{'len'} = 's/^len(.*)/p length($1)/';
    $DB'alias{'stop'} = 's/^stop (at|in)/b/';
    $DB'alias{'.'} =
      's/^\./p "\$DB\'sub(\$DB\'line):\t",\$DB\'line[\$DB\'line]/';