Merge from depluralization branch
[catagits/Catalyst-Manual.git] / lib / Catalyst / Manual / Tutorial / Debugging.pod
index 6aef0e7..fe78ff2 100644 (file)
@@ -1,11 +1,11 @@
 =head1 NAME
 
-Catalyst::Manual::Tutorial::Debugging - Catalyst Tutorial - Part 7: Debugging
+Catalyst::Manual::Tutorial::Debugging - Catalyst Tutorial - Chapter 7: Debugging
 
 
 =head1 OVERVIEW
 
-This is B<Part 7 of 10> for the Catalyst tutorial.
+This is B<Chapter 7 of 10> for the Catalyst tutorial.
 
 L<Tutorial Overview|Catalyst::Manual::Tutorial>
 
@@ -56,7 +56,7 @@ L<Appendices|Catalyst::Manual::Tutorial::Appendices>
 
 =head1 DESCRIPTION
 
-This part of the tutorial takes a brief look at the primary options
+This chapter of the tutorial takes a brief look at the primary options 
 available for troubleshooting Catalyst applications.
 
 Note that when it comes to debugging and troubleshooting, there are two
@@ -93,6 +93,16 @@ template view use:
 
     [% c.log.debug("This is a test log message") %]
 
+As with many other logging facilities, you a method is defined for
+each of the following "logging levels" (in increasing order of
+severity/importance):
+
+    $c->log->debug
+    $c->log->info
+    $c->log->warn
+    $c->log->error
+    $c->log->fatal
+
 You can also use L<Data::Dumper|Data::Dumper> in both Catalyst code 
 (C<use Data::Dumper; $c-E<gt>log-E<gt>debug("\$var is: ".Dumper($var));)>) 
 and TT templates (C<[% Dumper.dump(book) %]>.
@@ -118,7 +128,7 @@ you can obviously indent them if you prefer):
             
         # Retrieve all of the book records as book model objects and store in the
         # stash where they can be accessed by the TT template
-        $c->stash->{books} = [$c->model('DB::Books')->all];
+        $c->stash->{books} = [$c->model('DB::Book')->all];
             
         # Set the TT template to use.  You will almost always want to do this
         # in your action methods.
@@ -130,6 +140,10 @@ encountered (it has no effect when Perl is run without the C<-d> flag).
 
 B<NOTE:> The C<DB> here is the Perl Debugger, not the DB model.
 
+If you haven't done it already, enable SQL logging as before:
+
+    $ export DBIC_TRACE=1
+
 To now run the Catalyst development server under the Perl debugger, simply 
 prepend C<perl -d> to the front of C<script/myapp_server.pl>:
 
@@ -139,12 +153,12 @@ This will start the interactive debugger and produce output similar to:
 
     $ perl -d script/myapp_server.pl  
     
-    Loading DB routines from perl5db.pl version 1.27
+    Loading DB routines from perl5db.pl version 1.3
     Editor support available.
     
     Enter h or `h h' for help, or `man perldebug' for more help.
     
-    main::(script/myapp_server.pl:14):      my $debug         = 0;
+    main::(script/myapp_server.pl:16):      my $debug         = 0;
     
       DB<1> 
 
@@ -158,8 +172,8 @@ in.  Once the breakpoint is encountered in the
 C<MyApp::Controller::list> method, the console session running the
 development server will drop to the Perl debugger prompt:
 
-    MyApp::Controller::Books::list(/home/me/MyApp/script/../lib/MyApp/Controller/Books.pm:40):
-    40:         $c->stash->{books} = [$c->model('DB::Books')->all];
+    MyApp::Controller::Books::list(/home/me/MyApp/script/../lib/MyApp/Controller/Books.pm:48):
+    48:         $c->stash->{books} = [$c->model('DB::Book')->all];
     
       DB<1>
 
@@ -169,9 +183,9 @@ model (C<n> jumps over method/subroutine calls; you can also use C<s> to
 C<single-step> into methods/subroutines):
 
       DB<1> n
-    SELECT me.id, me.authors, me.title, me.rating FROM books me:
-    MyApp::Controller::Books::list(/home/me/MyApp/script/../lib/MyApp/Controller/Books.pm:44):
-    44:         $c->stash->{template} = 'books/list.tt2';
+    SELECT me.id, me.title, me.rating, me.created, me.updated FROM book me:
+    MyApp::Controller::Books::list(/home/me/MyApp/script/../lib/MyApp/Controller/Books.pm:53):
+    53:         $c->stash->{template} = 'books/list.tt2';
     
       DB<1>
 
@@ -181,27 +195,25 @@ output also shows up in the development server debug information.
 
 Next, list the methods available on our C<Book> model:
 
-      DB<1> m $c->model('DB::Books')
+      DB<1> m $c->model('DB::Book')
     ()
     (0+
     (bool
-    MODIFY_CODE_ATTRIBUTES
-    _attr_cache
-    _collapse_result
-    _construct_object
-    _count
-    _result_class_accessor
-    _result_source_accessor
-    all
-    carp
+    __result_class_accessor
+    __source_handle_accessor
+    _add_alias
+    __bool
+    _build_unique_query
+    _calculate_score
+    _collapse_cond
     <lines removed for brevity>
     
       DB<2>
 
 We can also play with the model directly:
 
-      DB<2> x ($c->model('DB::Books')->all)[1]->title
-    SELECT me.id, me.title, me.rating FROM books me:
+      DB<2> x ($c->model('DB::Book')->all)[1]->title
+    SELECT me.id, me.title, me.rating, me.created, me.updated FROM book me:
     0  'TCP/IP Illustrated, Volume 1'
 
 This uses the Perl debugger C<x> command to display the title of a book.
@@ -213,9 +225,11 @@ argument to the C<x> command limits the depth of the dump to 4 levels):
     0  ARRAY(0xa8f3b7c)
        0  MyApp::Model::DB::Book=HASH(0xb8e702c)
           '_column_data' => HASH(0xb8e5e2c)
+             'created' => '2009-05-08 10:19:46'
              'id' => 1
              'rating' => 5
              'title' => 'CCSP SNRS Exam Certification Guide'
+             'updated' => '2009-05-08 10:19:46'
           '_in_storage' => 1
     <lines removed for brevity>
 
@@ -227,16 +241,32 @@ breakpoint is hit (or the application exits):
 
 Finally, press C<Ctrl+C> to break out of the development server.
 Because we are running inside the Perl debugger, you will drop to the
-debugger prompt.  Press C<q> to exit the debugger and return to your OS
+debugger prompt.  
+
+    ^CCatalyst::Engine::HTTP::run(/usr/local/share/perl/5.10.0/Catalyst/Engine/HTTP.pm:260):
+    260:            while ( accept( Remote, $daemon ) ) {
+
+    DB<4>
+
+Finally, press C<q> to exit the debugger and return to your OS
 shell prompt:
 
       DB<4> q
     $
 
 For more information on using the Perl debugger, please see C<perldebug>
-and C<perldebtut>.  You can also type C<h> or C<h h> at the debugger
-prompt to view the built-in help screens.
+and C<perldebtut>.  For those daring souls out there, you can dive down
+even deeper into the magical depths of this fine debugger by checking
+out C<perldebguts>.
+
+You can also type C<h> or C<h h> at the debugger prompt to view the
+built-in help screens.
+
+For an excellent book covering all aspects of the Perl debugger, we highly
+recommend reading 'Pro Perl Debugging' by Richard Foley.
 
+Oh yeah, before you forget, be sure to remove the C<DB::single=1> line you
+added above in C<lib/MyApp/Controller/Books.pm>.
 
 =head1 DEBUGGING MODULES FROM CPAN
 
@@ -258,9 +288,9 @@ copy of an installed module:
 
     mkdir -p lib/Module; cp `perldoc -l Module::Name` lib/Module/
 
-Note: If you are following along in Ubuntu, you will need to install
-the C<perl-doc> package to use the C<perldoc> command.  Use 
-C<sudo apt-get install perl-doc> to do that.
+Note: If you are following along in Debian 5 or Ubuntu, you will
+need to install the C<perl-doc> package to use the C<perldoc> command.  
+Use C<sudo aptitude install perl-doc> to do that.
 
 For example, you could make a copy of 
 L<Catalyst::Plugin::Authentication|Catalyst::Plugin::Authentication>
@@ -289,6 +319,12 @@ For example:
         'print $Catalyst::Plugin::Authentication::VERSION;'
     0.07
 
+and if you are using bash aliases:
+
+    alias pmver="perl -le '\$m = shift; eval qq(require \$m) \
+        or die qq(module \"\$m\" is not installed\\n); \
+        print \$m->VERSION'"
+
 =item * 
 
 Check if a modules contains a given method:
@@ -330,6 +366,7 @@ with the tutorial> (especially the 'undef' option -- leaving this
 enabled will conflict with several of the conventions used by this 
 tutorial to leave some variables undefined on purpose).
 
+Happy debugging.
 
 =head1 AUTHOR