1=head1 NAME
2
3perldebtut - Perl debugging tutorial
4
5=head1 DESCRIPTION
6
7A (very) lightweight introduction in the use of the perl debugger, and a
8pointer to existing, deeper sources of information on the subject of debugging
9perl programs.
10
11There's an extraordinary number of people out there who don't appear to know
12anything about using the perl debugger, though they use the language every
13day.
14This is for them.
15
16
17=head1 use strict
18
19First of all, there's a few things you can do to make your life a lot more
20straightforward when it comes to debugging perl programs, without using the
21debugger at all.  To demonstrate, here's a simple script, named "hello", with
22a problem:
23
24	#!/usr/bin/perl
25
26	$var1 = 'Hello World'; # always wanted to do that :-)
27	$var2 = "$varl\n";
28
29	print $var2;
30	exit;
31
32While this compiles and runs happily, it probably won't do what's expected,
33namely it doesn't print "Hello World\n" at all;  It will on the other hand do
34exactly what it was told to do, computers being a bit that way inclined.  That
35is, it will print out a newline character, and you'll get what looks like a
36blank line.  It looks like there's 2 variables when (because of the typo)
37there's really 3:
38
39	$var1 = 'Hello World';
40	$varl = undef;
41	$var2 = "\n";
42
43To catch this kind of problem, we can force each variable to be declared
44before use by pulling in the strict module, by putting 'use strict;' after the
45first line of the script.
46
47Now when you run it, perl complains about the 3 undeclared variables and we
48get four error messages because one variable is referenced twice:
49
50 Global symbol "$var1" requires explicit package name at ./t1 line 4.
51 Global symbol "$var2" requires explicit package name at ./t1 line 5.
52 Global symbol "$varl" requires explicit package name at ./t1 line 5.
53 Global symbol "$var2" requires explicit package name at ./t1 line 7.
54 Execution of ./hello aborted due to compilation errors.
55
56Luvverly! and to fix this we declare all variables explicitly and now our
57script looks like this:
58
59	#!/usr/bin/perl
60	use strict;
61
62	my $var1 = 'Hello World';
63	my $varl = undef;
64	my $var2 = "$varl\n";
65
66	print $var2;
67	exit;
68
69We then do (always a good idea) a syntax check before we try to run it again:
70
71	> perl -c hello
72	hello syntax OK
73
74And now when we run it, we get "\n" still, but at least we know why.  Just
75getting this script to compile has exposed the '$varl' (with the letter 'l')
76variable, and simply changing $varl to $var1 solves the problem.
77
78
79=head1 Looking at data and -w and v
80
81Ok, but how about when you want to really see your data, what's in that
82dynamic variable, just before using it?
83
84	#!/usr/bin/perl
85	use strict;
86
87	my $key = 'welcome';
88	my %data = (
89		'this' => qw(that),
90		'tom' => qw(and jerry),
91		'welcome' => q(Hello World),
92		'zip' => q(welcome),
93	);
94	my @data = keys %data;
95
96	print "$data{$key}\n";
97	exit;
98
99Looks OK, after it's been through the syntax check (perl -c scriptname), we
100run it and all we get is a blank line again!  Hmmmm.
101
102One common debugging approach here, would be to liberally sprinkle a few print
103statements, to add a check just before we print out our data, and another just
104after:
105
106	print "All OK\n" if grep($key, keys %data);
107	print "$data{$key}\n";
108	print "done: '$data{$key}'\n";
109
110And try again:
111
112	> perl data
113	All OK
114
115	done: ''
116
117After much staring at the same piece of code and not seeing the wood for the
118trees for some time, we get a cup of coffee and try another approach.  That
119is, we bring in the cavalry by giving perl the 'B<-d>' switch on the command
120line:
121
122	> perl -d data
123	Default die handler restored.
124
125	Loading DB routines from perl5db.pl version 1.07
126	Editor support available.
127
128	Enter h or `h h' for help, or `man perldebug' for more help.
129
130	main::(./data:4):     my $key = 'welcome';
131
132Now, what we've done here is to launch the built-in perl debugger on our
133script.  It's stopped at the first line of executable code and is waiting for
134input.
135
136Before we go any further, you'll want to know how to quit the debugger: use
137just the letter 'B<q>', not the words 'quit' or 'exit':
138
139	DB<1> q
140	>
141
142That's it, you're back on home turf again.
143
144
145=head1 help
146
147Fire the debugger up again on your script and we'll look at the help menu.
148There's a couple of ways of calling help: a simple 'B<h>' will get the summary
149help list, 'B<|h>' (pipe-h) will pipe the help through your pager (which is
150(probably 'more' or 'less'), and finally, 'B<h h>' (h-space-h) will give you
151the entire help screen.  Here is the summary page:
152
153DB<1>h
154
155 List/search source lines:               Control script execution:
156  l [ln|sub]  List source code            T           Stack trace
157  - or .      List previous/current line  s [expr]    Single step
158                                                               [in expr]
159  v [line]    View around line            n [expr]    Next, steps over
160                                                                    subs
161  f filename  View source in file         <CR/Enter>  Repeat last n or s
162  /pattern/ ?patt?   Search forw/backw    r           Return from
163                                                              subroutine
164  M           Show module versions        c [ln|sub]  Continue until
165                                                                position
166 Debugger controls:                       L           List break/watch/
167                                                                 actions
168  o [...]     Set debugger options        t [expr]    Toggle trace
169                                                            [trace expr]
170  <[<]|{[{]|>[>] [cmd] Do pre/post-prompt b [ln|event|sub] [cnd] Set
171                                                              breakpoint
172  ! [N|pat]   Redo a previous command     B ln|*      Delete a/all
173                                                             breakpoints
174  H [-num]    Display last num commands   a [ln] cmd  Do cmd before line
175  = [a val]   Define/list an alias        A ln|*      Delete a/all
176                                                                 actions
177  h [db_cmd]  Get help on command         w expr      Add a watch
178                                                              expression
179  h h         Complete help page          W expr|*    Delete a/all watch
180                                                                   exprs
181  |[|]db_cmd  Send output to pager        ![!] syscmd Run cmd in a
182                                                              subprocess
183  q or ^D     Quit                        R           Attempt a restart
184 Data Examination:     expr     Execute perl code, also see: s,n,t expr
185  x|m expr       Evals expr in list context, dumps the result or lists
186                                                                methods.
187  p expr         Print expression (uses script's current package).
188  S [[!]pat]     List subroutine names [not] matching pattern
189  V [Pk [Vars]]  List Variables in Package.  Vars can be ~pattern or
190                                                               !pattern.
191  X [Vars]       Same as "V current_package [Vars]".
192  y [n [Vars]]   List lexicals in higher scope <n>.  Vars same as V.
193 For more help, type h cmd_letter, or run man perldebug for all docs.
194
195More confusing options than you can shake a big stick at!  It's not as bad as
196it looks and it's very useful to know more about all of it, and fun too!
197
198There's a couple of useful ones to know about straight away.  You wouldn't
199think we're using any libraries at all at the moment, but 'B<M>' will show
200which modules are currently loaded, and their version number, while 'B<m>'
201will show the methods, and 'B<S>' shows all subroutines (by pattern) as
202shown below.  'B<V>' and 'B<X>' show variables in the program by package
203scope and can be constrained by pattern.
204
205	DB<2>S str
206	dumpvar::stringify
207	strict::bits
208	strict::import
209	strict::unimport
210
211Using 'X' and cousins requires you not to use the type identifiers ($@%), just
212the 'name':
213
214	DM<3>X ~err
215	FileHandle(stderr) => fileno(2)
216
217Remember we're in our tiny program with a problem, we should have a look at
218where we are, and what our data looks like. First of all let's view some code
219at our present position (the first line of code in this case), via 'B<v>':
220
221	DB<4> v
222	1       #!/usr/bin/perl
223	2:      use strict;
224	3
225	4==>    my $key = 'welcome';
226	5:      my %data = (
227	6               'this' => qw(that),
228	7               'tom' => qw(and jerry),
229	8               'welcome' => q(Hello World),
230	9               'zip' => q(welcome),
231	10      );
232
233At line number 4 is a helpful pointer, that tells you where you are now.  To
234see more code, type 'v' again:
235
236	DB<4> v
237	8               'welcome' => q(Hello World),
238	9               'zip' => q(welcome),
239	10      );
240	11:     my @data = keys %data;
241	12:     print "All OK\n" if grep($key, keys %data);
242	13:     print "$data{$key}\n";
243	14:     print "done: '$data{$key}'\n";
244	15:     exit;
245
246And if you wanted to list line 5 again, type 'l 5', (note the space):
247
248	DB<4> l 5
249	5:      my %data = (
250
251In this case, there's not much to see, but of course normally there's pages of
252stuff to wade through, and 'l' can be very useful.  To reset your view to the
253line we're about to execute, type a lone period '.':
254
255	DB<5> .
256	main::(./data_a:4):     my $key = 'welcome';
257
258The line shown is the one that is about to be executed B<next>, it hasn't
259happened yet.  So while we can print a variable with the letter 'B<p>', at
260this point all we'd get is an empty (undefined) value back.  What we need to
261do is to step through the next executable statement with an 'B<s>':
262
263	DB<6> s
264	main::(./data_a:5):     my %data = (
265	main::(./data_a:6):             'this' => qw(that),
266	main::(./data_a:7):             'tom' => qw(and jerry),
267	main::(./data_a:8):             'welcome' => q(Hello World),
268	main::(./data_a:9):             'zip' => q(welcome),
269	main::(./data_a:10):    );
270
271Now we can have a look at that first ($key) variable:
272
273	DB<7> p $key
274	welcome
275
276line 13 is where the action is, so let's continue down to there via the letter
277'B<c>', which by the way, inserts a 'one-time-only' breakpoint at the given
278line or sub routine:
279
280	DB<8> c 13
281	All OK
282	main::(./data_a:13):    print "$data{$key}\n";
283
284We've gone past our check (where 'All OK' was printed) and have stopped just
285before the meat of our task.  We could try to print out a couple of variables
286to see what is happening:
287
288	DB<9> p $data{$key}
289
290Not much in there, lets have a look at our hash:
291
292	DB<10> p %data
293	Hello Worldziptomandwelcomejerrywelcomethisthat
294
295	DB<11> p keys %data
296	Hello Worldtomwelcomejerrythis
297
298Well, this isn't very easy to read, and using the helpful manual (B<h h>), the
299'B<x>' command looks promising:
300
301	DB<12> x %data
302	0  'Hello World'
303	1  'zip'
304	2  'tom'
305	3  'and'
306	4  'welcome'
307	5  undef
308	6  'jerry'
309	7  'welcome'
310	8  'this'
311	9  'that'
312
313That's not much help, a couple of welcomes in there, but no indication of
314which are keys, and which are values, it's just a listed array dump and, in
315this case, not particularly helpful.  The trick here, is to use a B<reference>
316to the data structure:
317
318	DB<13> x \%data
319	0  HASH(0x8194bc4)
320	   'Hello World' => 'zip'
321	   'jerry' => 'welcome'
322	   'this' => 'that'
323	   'tom' => 'and'
324	   'welcome' => undef
325
326The reference is truly dumped and we can finally see what we're dealing with.
327Our quoting was perfectly valid but wrong for our purposes, with 'and jerry'
328being treated as 2 separate words rather than a phrase, thus throwing the
329evenly paired hash structure out of alignment.
330
331The 'B<-w>' switch would have told us about this, had we used it at the start,
332and saved us a lot of trouble:
333
334	> perl -w data
335	Odd number of elements in hash assignment at ./data line 5.
336
337We fix our quoting: 'tom' => q(and jerry), and run it again, this time we get
338our expected output:
339
340	> perl -w data
341	Hello World
342
343
344While we're here, take a closer look at the 'B<x>' command, it's really useful
345and will merrily dump out nested references, complete objects, partial objects
346- just about whatever you throw at it:
347
348Let's make a quick object and x-plode it, first we'll start the debugger:
349it wants some form of input from STDIN, so we give it something non-committal,
350a zero:
351
352 > perl -de 0
353 Default die handler restored.
354
355 Loading DB routines from perl5db.pl version 1.07
356 Editor support available.
357
358 Enter h or `h h' for help, or `man perldebug' for more help.
359
360 main::(-e:1):   0
361
362Now build an on-the-fly object over a couple of lines (note the backslash):
363
364 DB<1> $obj = bless({'unique_id'=>'123', 'attr'=> \
365 cont: 	{'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class')
366
367And let's have a look at it:
368
369  	DB<2> x $obj
370 0  MY_class=HASH(0x828ad98)
371   		'attr' => HASH(0x828ad68)
372      	'col' => 'black'
373      	'things' => ARRAY(0x828abb8)
374         	0  'this'
375         	1  'that'
376         	2  'etc'
377   		'unique_id' => 123
378  	DB<3>
379
380Useful, huh?  You can eval nearly anything in there, and experiment with bits
381of code or regexes until the cows come home:
382
383 DB<3> @data = qw(this that the other atheism leather theory scythe)
384
385 DB<4> p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data))
386 atheism
387 leather
388 other
389 scythe
390 the
391 theory
392 saw -> 6
393
394If you want to see the command History, type an 'B<H>':
395
396 DB<5> H
397 4: p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data))
398 3: @data = qw(this that the other atheism leather theory scythe)
399 2: x $obj
400 1: $obj = bless({'unique_id'=>'123', 'attr'=>
401 {'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class')
402 DB<5>
403
404And if you want to repeat any previous command, use the exclamation: 'B<!>':
405
406 DB<5> !4
407 p 'saw -> '.($cnt += map { print "$_\n" } grep(/the/, sort @data))
408 atheism
409 leather
410 other
411 scythe
412 the
413 theory
414 saw -> 12
415
416For more on references see L<perlref> and L<perlreftut>
417
418
419=head1 Stepping through code
420
421Here's a simple program which converts between Celsius and Fahrenheit, it too
422has a problem:
423
424 #!/usr/bin/perl -w
425 use strict;
426
427 my $arg = $ARGV[0] || '-c20';
428
429 if ($arg =~ /^\-(c|f)((\-|\+)*\d+(\.\d+)*)$/) {
430	my ($deg, $num) = ($1, $2);
431	my ($in, $out) = ($num, $num);
432	if ($deg eq 'c') {
433		$deg = 'f';
434		$out = &c2f($num);
435	} else {
436		$deg = 'c';
437		$out = &f2c($num);
438	}
439	$out = sprintf('%0.2f', $out);
440	$out =~ s/^((\-|\+)*\d+)\.0+$/$1/;
441	print "$out $deg\n";
442 } else {
443	print "Usage: $0 -[c|f] num\n";
444 }
445 exit;
446
447 sub f2c {
448	my $f = shift;
449	my $c = 5 * $f - 32 / 9;
450	return $c;
451 }
452
453 sub c2f {
454	my $c = shift;
455	my $f = 9 * $c / 5 + 32;
456	return $f;
457 }
458
459
460For some reason, the Fahrenheit to Celsius conversion fails to return the
461expected output.  This is what it does:
462
463 > temp -c0.72
464 33.30 f
465
466 > temp -f33.3
467 162.94 c
468
469Not very consistent!  We'll set a breakpoint in the code manually and run it
470under the debugger to see what's going on.  A breakpoint is a flag, to which
471the debugger will run without interruption, when it reaches the breakpoint, it
472will stop execution and offer a prompt for further interaction.  In normal
473use, these debugger commands are completely ignored, and they are safe - if a
474little messy, to leave in production code.
475
476	my ($in, $out) = ($num, $num);
477	$DB::single=2; # insert at line 9!
478	if ($deg eq 'c')
479		...
480
481	> perl -d temp -f33.3
482	Default die handler restored.
483
484	Loading DB routines from perl5db.pl version 1.07
485	Editor support available.
486
487	Enter h or `h h' for help, or `man perldebug' for more help.
488
489	main::(temp:4): my $arg = $ARGV[0] || '-c100';
490
491We'll simply continue down to our pre-set breakpoint with a 'B<c>':
492
493  	DB<1> c
494	main::(temp:10):                if ($deg eq 'c') {
495
496Followed by a view command to see where we are:
497
498	DB<1> v
499	7:              my ($deg, $num) = ($1, $2);
500	8:              my ($in, $out) = ($num, $num);
501	9:              $DB::single=2;
502	10==>           if ($deg eq 'c') {
503	11:                     $deg = 'f';
504	12:                     $out = &c2f($num);
505	13              } else {
506	14:                     $deg = 'c';
507	15:                     $out = &f2c($num);
508	16              }
509
510And a print to show what values we're currently using:
511
512	DB<1> p $deg, $num
513	f33.3
514
515We can put another break point on any line beginning with a colon, we'll use
516line 17 as that's just as we come out of the subroutine, and we'd like to
517pause there later on:
518
519	DB<2> b 17
520
521There's no feedback from this, but you can see what breakpoints are set by
522using the list 'L' command:
523
524	DB<3> L
525	temp:
526 		17:            print "$out $deg\n";
527   		break if (1)
528
529Note that to delete a breakpoint you use 'B'.
530
531Now we'll continue down into our subroutine, this time rather than by line
532number, we'll use the subroutine name, followed by the now familiar 'v':
533
534	DB<3> c f2c
535	main::f2c(temp:30):             my $f = shift;
536
537	DB<4> v
538	24:     exit;
539	25
540	26      sub f2c {
541	27==>           my $f = shift;
542	28:             my $c = 5 * $f - 32 / 9;
543	29:             return $c;
544	30      }
545	31
546	32      sub c2f {
547	33:             my $c = shift;
548
549
550Note that if there was a subroutine call between us and line 29, and we wanted
551to B<single-step> through it, we could use the 'B<s>' command, and to step
552over it we would use 'B<n>' which would execute the sub, but not descend into
553it for inspection.  In this case though, we simply continue down to line 29:
554
555	DB<4> c 29
556	main::f2c(temp:29):             return $c;
557
558And have a look at the return value:
559
560	DB<5> p $c
561	162.944444444444
562
563This is not the right answer at all, but the sum looks correct.  I wonder if
564it's anything to do with operator precedence?  We'll try a couple of other
565possibilities with our sum:
566
567	DB<6> p (5 * $f - 32 / 9)
568	162.944444444444
569
570	DB<7> p 5 * $f - (32 / 9)
571	162.944444444444
572
573	DB<8> p (5 * $f) - 32 / 9
574	162.944444444444
575
576	DB<9> p 5 * ($f - 32) / 9
577	0.722222222222221
578
579:-) that's more like it!  Ok, now we can set our return variable and we'll
580return out of the sub with an 'r':
581
582	DB<10> $c = 5 * ($f - 32) / 9
583
584	DB<11> r
585	scalar context return from main::f2c: 0.722222222222221
586
587Looks good, let's just continue off the end of the script:
588
589	DB<12> c
590	0.72 c
591	Debugged program terminated.  Use q to quit or R to restart,
592  	use O inhibit_exit to avoid stopping after program termination,
593  	h q, h R or h O to get additional info.
594
595A quick fix to the offending line (insert the missing parentheses) in the
596actual program and we're finished.
597
598
599=head1 Placeholder for a, w, t, T
600
601Actions, watch variables, stack traces etc.: on the TODO list.
602
603	a
604
605	w
606
607	t
608
609	T
610
611
612=head1 REGULAR EXPRESSIONS
613
614Ever wanted to know what a regex looked like?  You'll need perl compiled with
615the DEBUGGING flag for this one:
616
617  > perl -Dr -e '/^pe(a)*rl$/i'
618  Compiling REx `^pe(a)*rl$'
619  size 17 first at 2
620  rarest char
621   at 0
622     1: BOL(2)
623     2: EXACTF <pe>(4)
624     4: CURLYN[1] {0,32767}(14)
625     6:   NOTHING(8)
626     8:   EXACTF <a>(0)
627    12:   WHILEM(0)
628    13: NOTHING(14)
629    14: EXACTF <rl>(16)
630    16: EOL(17)
631    17: END(0)
632  floating `'$ at 4..2147483647 (checking floating) stclass
633    `EXACTF <pe>' anchored(BOL) minlen 4
634  Omitting $` $& $' support.
635
636  EXECUTING...
637
638  Freeing REx: `^pe(a)*rl$'
639
640Did you really want to know? :-)
641For more gory details on getting regular expressions to work, have a look at
642L<perlre>, L<perlretut>, and to decode the mysterious labels (BOL and CURLYN,
643etc. above), see L<perldebguts>.
644
645
646=head1 OUTPUT TIPS
647
648To get all the output from your error log, and not miss any messages via
649helpful operating system buffering, insert a line like this, at the start of
650your script:
651
652	$|=1;
653
654To watch the tail of a dynamically growing logfile, (from the command line):
655
656	tail -f $error_log
657
658Wrapping all die calls in a handler routine can be useful to see how, and from
659where, they're being called, L<perlvar> has more information:
660
661    BEGIN { $SIG{__DIE__} = sub { require Carp; Carp::confess(@_) } }
662
663Various useful techniques for the redirection of STDOUT and STDERR filehandles
664are explained in L<perlopentut> and L<perlfaq8>.
665
666
667=head1 CGI
668
669Just a quick hint here for all those CGI programmers who can't figure out how
670on earth to get past that 'waiting for input' prompt, when running their CGI
671script from the command-line, try something like this:
672
673	> perl -d my_cgi.pl -nodebug
674
675Of course L<CGI> and L<perlfaq9> will tell you more.
676
677
678=head1 GUIs
679
680The command line interface is tightly integrated with an B<emacs> extension
681and there's a B<vi> interface too.
682
683You don't have to do this all on the command line, though, there are a few GUI
684options out there.  The nice thing about these is you can wave a mouse over a
685variable and a dump of its data will appear in an appropriate window, or in a
686popup balloon, no more tiresome typing of 'x $varname' :-)
687
688In particular have a hunt around for the following:
689
690B<ptkdb> perlTK based wrapper for the built-in debugger
691
692B<ddd> data display debugger
693
694B<PerlDevKit> and B<PerlBuilder> are NT specific
695
696NB. (more info on these and others would be appreciated).
697
698
699=head1 SUMMARY
700
701We've seen how to encourage good coding practices with B<use strict> and
702B<-w>.  We can run the perl debugger B<perl -d scriptname> to inspect your
703data from within the perl debugger with the B<p> and B<x> commands.  You can
704walk through your code, set breakpoints with B<b> and step through that code
705with B<s> or B<n>, continue with B<c> and return from a sub with B<r>.  Fairly
706intuitive stuff when you get down to it.
707
708There is of course lots more to find out about, this has just scratched the
709surface.  The best way to learn more is to use perldoc to find out more about
710the language, to read the on-line help (L<perldebug> is probably the next
711place to go), and of course, experiment.
712
713
714=head1 SEE ALSO
715
716L<perldebug>,
717L<perldebguts>,
718L<perl5db.pl>,
719L<perldiag>,
720L<perlrun>
721
722
723=head1 AUTHOR
724
725Richard Foley <richard.foley@rfi.net> Copyright (c) 2000
726
727
728=head1 CONTRIBUTORS
729
730Various people have made helpful suggestions and contributions, in particular:
731
732Ronald J Kimball <rjk@linguist.dartmouth.edu>
733
734Hugo van der Sanden <hv@crypt0.demon.co.uk>
735
736Peter Scott <Peter@PSDT.com>
737
738