The Perl Debugger
By Richard Foley (richard) from Munich.pm Date: Sunday, 29 April 2007 13:30
Duration: 30 minutes Language: What is it?
It's a tool to help find bugs
Complementary Strategies
The print statement
Logging
DEAP
Things to do first
syntax check
use strict
use warnings and diagnostics
taint
Debugger Features
Stop the program at any executable line of code or subroutine
Stop the program on any condition
Stop the program if a variable value changes
Inspect class hierarchies
Inspect methods and code
Trace code execution
Execute a command before/after every executable line
On the fly modification of variables and code
Follow forking programs
Follow threaded programs and their variables
Save and reexecute sessions
How do I use it?
#!/usr/bin/perl -d
perl -d program.pl
perl -d -e 0
perl -dt program.pl
perl -d:ptkdb (gui)
help
DB<1> h
List/search source lines: Control script execution:
l [ln|sub] List source code T Stack trace
- or . List previous/current line s [expr] Single step [in expr]
v [line] View around line n [expr] Next, steps over subs
f filename View source in file <CR/Enter> Repeat last n or s
/pattern/ ?patt? Search forw/backw r Return from subroutine
M Show module versions c [ln|sub] Continue until position
Debugger controls: L List break/watch/actions
o [...] Set debugger options t [expr] Toggle trace [trace expr]
<[<]|{[{]|>[>] [cmd] Do pre/post-prompt b [ln|event|sub] [cnd] Set breakpoint
! [N|pat] Redo a previous command B ln|* Delete a/all breakpoints
H [-num] Display last num commands a [ln] cmd Do cmd before line
= [a val] Define/list an alias A ln|* Delete a/all actions
h [db_cmd] Get help on command w expr Add a watch expression
h h Complete help page W expr|* Delete a/all watch exprs
|[|]db_cmd Send output to pager ![!] syscmd Run cmd in a subprocess
q or ^D Quit R Attempt a restart
Data Examination: expr Execute perl code, also see: s,n,t expr
x|m expr Evals expr in list context, dumps the result or lists methods.
p expr Print expression (uses script's current package).
S [[!]pat] List subroutine names [not] matching pattern
V [Pk [Vars]] List Variables in Package. Vars can be ~pattern or !pattern.
X [Vars] Same as "V current_package [Vars]". i class inheritance tree.
y [n [Vars]] List lexicals in higher scope <n>. Vars same as V.
e Display thread id E Display all thread ids.
For more help, type h cmd_letter, or run man perldebug for all docs.
Commands
help - h, hh, man, perldoc
step - c, n, s, r
breakpoints - b, B
- line [condition]
- [postpone] subroutine [condition]
- compile subroutine
- load [filename]
actions - a, A
- [line] command [condition]
watches - w, W
- w [condition]
list abw - L [abw]
trace - t, T
list code - l, m, S, v, f
search code - . / ? -
inspect variables - p, V, x, X, y
threads - e, E
pre/post line commands - <, <<, >, >>, {, {{
options - depth of dumps for arrays and hashes
- frame settings, window size,
commands - H, R, rerun
system - ! !! |
save, source
Environment
PERLDB_OPTS="nonStop autoTrace lineInfo=db.out"
.perldb
sub afterinit {...}
@DB::typeahead
$DB::single 1=s, 2=n
Apache and mod_perl
#!/usr/bin/perl -d
DISPLAY='192.168.0.69:0.0' perl -d:ptkdb -e 0
httpd -X
Apache::DB - (db.pl)
Apache::DProf
Customisation
PERL5DB="{ sub DB::DB { print '.' } }"
PERL5DB="{ require 'mydb.pl' }"
Related Tools
Devel::ptkdb
Devel::Trace
Devel::ebug
Devel::DProf
Devel::*
B::Deparse
Further Reading and References
perldoc
perldebug
perldebugtut
perldebguts
perlrun
http://debugger.perl.org
Perl Debugged - Addison-Wesley - Peter Scott & Ed Wright
Perl Debugger Pocket Reference - O'Reilly
Pro Perl Debugging - Apress |