2 <html lang="en-us" itemscope itemtype="http://schema.org/Article">
5 <meta name="description" content="The Perl debugger is one of those valuable tools that surprisingly it seems few Perl coders know well. Here are some quick tips on using the Perl debugger. First a few explanations about commands I tend to use: s Single...">
6 <meta name="generator" content="Movable Type 5.2.3">
7 <title>PerlDB Tips - Status</title>
8 <link rel="alternate" type="application/atom+xml" title="Recent Entries" href="http://defaria.com/blogs/Status/atom.xml">
9 <link rel="canonical" href="http://defaria.com/blogs/Status/2006/10/perldb-tips.html">
10 <meta name="viewport" content="width=device-width,initial-scale=1">
11 <link rel="stylesheet" href="http://defaria.com/blogs/Status/styles.css">
13 <link rel="stylesheet" href="http://defaria.com/blogs/Status/styles_ie.css">
14 <script src="/mt/mt-static/support/theme_static/rainier/js/html5shiv.js"></script>
17 <link rel="start" href="http://defaria.com/blogs/Status/">
19 <link rel="prev" href="http://defaria.com/blogs/Status/2006/10/gpdb-add-projec.html" title="gpdb_add_project.pl using gpdb user and Nice">
20 <link rel="next" href="http://defaria.com/blogs/Status/2006/10/the-oracle-spea.html" title="The Oracle speaks...">
21 <!-- Open Graph Protocol -->
22 <meta property="og:type" content="article">
23 <meta property="og:locale" content="en-us">
24 <meta property="og:title" content="PerlDB Tips">
25 <meta property="og:url" content="http://defaria.com/blogs/Status/2006/10/perldb-tips.html">
26 <meta property="og:description" content="The Perl debugger is one of those valuable tools that surprisingly it seems few Perl coders know well. Here are some quick tips on using the Perl debugger. First a few explanations about commands I tend to use: s Single...">
27 <meta property="og:site_name" content="Status">
28 <meta property="og:image" content="/mt/mt-static/support/theme_static/rainier/img/siteicon-sample.png">
30 <meta itemprop="description" content="The Perl debugger is one of those valuable tools that surprisingly it seems few Perl coders know well. Here are some quick tips on using the Perl debugger. First a few explanations about commands I tend to use: s Single...">
31 <link itemprop="url" href="http://defaria.com/blogs/Status/2006/10/perldb-tips.html">
32 <link itemprop="image" href="/mt/mt-static/support/theme_static/rainier/img/siteicon-sample.png">
37 <div id="container-inner">
38 <header id="header" role="banner">
39 <div id="header-inner">
40 <div id="header-content">
42 <a href="http://defaria.com/blogs/Status/">
51 <nav role="navigation">
53 <li><a href="http://defaria.com/blogs/Status/">Home</a></li>
62 <div id="content-inner">
63 <ul class="breadcrumb breadcrumb-list">
64 <li class="breadcrumb-list-item"><a href="http://defaria.com/blogs/Status/">Home</a></li>
65 <li class="breadcrumb-list-item">PerlDB Tips</li>
67 <div id="individual-main" class="main" role="main">
68 <article id="entry-1839" class="entry entry-asset asset hentry">
69 <div class="asset-header">
70 <h2 itemprop="name" class="asset-name entry-title">PerlDB Tips</h2>
71 <footer class="asset-meta">
72 <ul class="asset-meta-list">
73 <li class="asset-meta-list-item">Posted on <time datetime="2006-10-17T08:41:48-08:00" itemprop="datePublished">October 17, 2006</time></li>
74 <li class="asset-meta-list-item">by <span class="author entry-author vcard"></span></li>
77 <li class="asset-meta-list-item">in <a itemprop="articleSection" rel="tag" href="http://defaria.com/blogs/Status/texas-instruments/">Texas Instruments</a></li>
83 <div class="entry-content asset-content" itemprop="articleBody">
84 <p>The Perl debugger is one of those valuable tools that surprisingly it seems few Perl coders know well. Here are some quick tips on using the Perl debugger. First a few explanations about commands I tend to use:
90 <dd>Single step. Step to the next statement stepping into any subroutines (where the source file is known and accessible).</dd>
94 <dd>Step over - if the line contains a call to a subroutine then this will step over that subroutine.</dd>
98 <dd>Return from subroutine - if, say you accidentally stepped into a subroutine or if you just want to return,</dd>
102 <dd>Rerun - start your Perl script again in the debugger with all the parms you started with.</dd>
108 <dt>p <variable or expression></dt>
110 <dd>Will print the contents of a variable or expression. Expressions can be Perl expressions including calls to subroutines. You can, for example, do "p 'There are " . scalar @foo . ' lines in foo';</dd>
112 <dt>x <variable or expression></dt>
114 <dd>Like p above however p will simply print out HASH for hashes whereas x will format them out. Also x will print out "undef" for things that are undefined yet p will print nothing for them.</dd>
118 <dd>List the next windowSize lines (see below). Use "l <n>" where <n> = a line number to list that line.</dd>
122 <dd>View lines around <n></dd>
124 <dt>V <package></dt>
126 <dd>List exported subroutines and variables for <package> (e.g. V MyModule will is all stuff exported from MyModule).</dd>
128 <dt>f <filename></dt>
130 <dd>File - switch to another file. (e.g. f MyModule) and the debugger switches to viewing MyModule.pm.</dd>
134 <dd>Continue to line <n>. If n is not specified then just continue until the next break point or the end of the script. Continue is like setting a temporary break point that disappears when you hit the line.</dd>
136 <dt>b <n> <condition></dt>
138 <dd>Breakpoint - set a break point (or b <n> $name eq "Donna" which will break at line <n> iff $name is "Donna" (evaluated when the debugger gets to line <n>))
142 <p>Also, at the Perl db prompt you can type in any Perl. So, for example, I often work out regex's that way. I'll be debugging a Perl script and stepping up to something like:</p>
144 <div class=code><pre>
145 10==> if (/(\d*).*\s+/) {
151 <p>Then I'll type in stuff like:</p>
153 <div class=code><pre>
154 DB<10> if (/(\d*).*\s+/) { print "1 = $1\n"; } else { print "No
160 <p>Then I can use the command history (with set -o emacs at the shell before executing perl db emacs key bindings work for me) to edit and enter that perl if statement changing the regex until it works correctly. This way I know I got the right regex. Copy and paste the new, tested, regex from the debugging session into my code then "R" to reload the debugger.</p>
162 <p>Or you can say call an arbitrary subroutine in your script:</p>
164 <div class=code><pre>
167 Rexec::ssh(/view/cmdt_x0062320/vobs/cmtools/src/misc/GPDB/bin/../../../../lib/perl/Rexec.pm:60):
168 60: my $self = shift;
172 <p>The "p Rexec::ssh" says to print the results of the following expression. The expression is a function call in to the Rexec module for the subroutine ssh. Since we just set a break point there in the previous debug command we break at the start of that subroutine and can then debug it. Note you don't want to "c Rexec::ssh" because that would continue the actual execution of your script and only stop at Rexec::ssh if that routine was actually called. Viola, you just forcefully caused the Perl interpreter to branch to this routine!</p>
174 <p>Another thing I'll frequently do is set or change variables to see how the code would proceed <b>if</b> the variables were correct (or perhaps incorrect to test error conditions). So let's say a forced execution of the subroutine Log like the above:
176 <div class=code><pre>
178 43:==> my $msg = shift;
182 main::Log(EvilTwin.pl:45): print "$msg\n";
183 DB<24>$msg = "Now I set msg to something I want it to be"
185 Now I set msg to something I want it to be
186 main::Log(EvilTwin.pl:47): return;
190 <p>There are all sorts of good reasons to examine (p $variable) and set ($variable = "new value") variables during debugging.</p>
192 <p>Finally put the following into ~/.perldb:</p>
194 <div class=code><pre>
195 parse_options ("windowSize=23");
198 <p>This sets the window size to 23 so that 'l" lists the next 23 lines.</p>
201 <nav class="page-navigation entry-navigation pagination content-nav">
202 <ul class="page-navigation-list">
204 <li class="page-navigation-list-item page-navigation-prev"><a rel="prev" href="http://defaria.com/blogs/Status/2006/10/gpdb-add-projec.html" title="gpdb_add_project.pl using gpdb user and Nice">Previous entry</a></li>
207 <li class="page-navigation-list-item page-navigation-next"><a rel="next" href="http://defaria.com/blogs/Status/2006/10/the-oracle-spea.html" title="The Oracle speaks...">Next entry</a></li>
212 <aside id="zenback" class="zenback feedback">
213 Please paste Zenback script code here.
220 <aside class="widgets related" role="complementary">
221 <nav class="widget-search widget">
222 <div class="widget-content">
223 <form method="get" id="search" action="http://defaria.com/mt/mt-search.cgi">
225 <input type="text" name="search" value="" placeholder="Search...">
227 <input type="hidden" name="IncludeBlogs" value="8">
229 <input type="hidden" name="limit" value="20">
230 <button type="submit" name="button">
231 <img alt="Search" src="/mt/mt-static/support/theme_static/rainier/img/search-icon.png">
237 <nav class="widget-archive-category widget">
238 <h3 class="widget-header">Categories</h3>
239 <div class="widget-content">
242 <ul class="widget-list">
245 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/ameriquest/">Ameriquest (99)</a>
253 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/audience/">Audience (3)</a>
261 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/broadcom/">Broadcom (76)</a>
269 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/gpdb/">GPDB (35)</a>
277 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/general-dynamics/">General Dynamics (61)</a>
285 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/general-electric/">General Electric (13)</a>
293 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/hewlett-packard/">Hewlett Packard (13)</a>
301 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/lynuxworks/">LynuxWorks (162)</a>
309 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/pqa/">PQA (35)</a>
317 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/salira/">Salira (79)</a>
325 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/tellabs/">Tellabs (2)</a>
333 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/texas-instruments/">Texas Instruments (31)</a>
345 <nav class="widget-archive-dropdown widget">
346 <h3 class="widget-header">Archives</h3>
347 <div class="widget-content">
349 <option>Select a Month...</option>
351 <option value="http://defaria.com/blogs/Status/2016/02/">February 2016</option>
355 <option value="http://defaria.com/blogs/Status/2014/09/">September 2014</option>
359 <option value="http://defaria.com/blogs/Status/2014/04/">April 2014</option>
363 <option value="http://defaria.com/blogs/Status/2014/03/">March 2014</option>
367 <option value="http://defaria.com/blogs/Status/2013/02/">February 2013</option>
371 <option value="http://defaria.com/blogs/Status/2012/09/">September 2012</option>
375 <option value="http://defaria.com/blogs/Status/2012/08/">August 2012</option>
379 <option value="http://defaria.com/blogs/Status/2012/05/">May 2012</option>
383 <option value="http://defaria.com/blogs/Status/2012/04/">April 2012</option>
387 <option value="http://defaria.com/blogs/Status/2012/02/">February 2012</option>
391 <option value="http://defaria.com/blogs/Status/2012/01/">January 2012</option>
395 <option value="http://defaria.com/blogs/Status/2011/10/">October 2011</option>
399 <option value="http://defaria.com/blogs/Status/2011/07/">July 2011</option>
403 <option value="http://defaria.com/blogs/Status/2010/09/">September 2010</option>
407 <option value="http://defaria.com/blogs/Status/2010/08/">August 2010</option>
411 <option value="http://defaria.com/blogs/Status/2010/04/">April 2010</option>
415 <option value="http://defaria.com/blogs/Status/2010/03/">March 2010</option>
419 <option value="http://defaria.com/blogs/Status/2010/02/">February 2010</option>
423 <option value="http://defaria.com/blogs/Status/2009/05/">May 2009</option>
427 <option value="http://defaria.com/blogs/Status/2009/04/">April 2009</option>
431 <option value="http://defaria.com/blogs/Status/2008/07/">July 2008</option>
435 <option value="http://defaria.com/blogs/Status/2008/05/">May 2008</option>
439 <option value="http://defaria.com/blogs/Status/2008/04/">April 2008</option>
443 <option value="http://defaria.com/blogs/Status/2008/03/">March 2008</option>
447 <option value="http://defaria.com/blogs/Status/2008/02/">February 2008</option>
451 <option value="http://defaria.com/blogs/Status/2008/01/">January 2008</option>
455 <option value="http://defaria.com/blogs/Status/2007/12/">December 2007</option>
459 <option value="http://defaria.com/blogs/Status/2007/11/">November 2007</option>
463 <option value="http://defaria.com/blogs/Status/2007/10/">October 2007</option>
467 <option value="http://defaria.com/blogs/Status/2007/09/">September 2007</option>
471 <option value="http://defaria.com/blogs/Status/2007/08/">August 2007</option>
475 <option value="http://defaria.com/blogs/Status/2007/07/">July 2007</option>
479 <option value="http://defaria.com/blogs/Status/2007/06/">June 2007</option>
483 <option value="http://defaria.com/blogs/Status/2007/05/">May 2007</option>
487 <option value="http://defaria.com/blogs/Status/2007/04/">April 2007</option>
491 <option value="http://defaria.com/blogs/Status/2007/03/">March 2007</option>
495 <option value="http://defaria.com/blogs/Status/2007/01/">January 2007</option>
499 <option value="http://defaria.com/blogs/Status/2006/12/">December 2006</option>
503 <option value="http://defaria.com/blogs/Status/2006/11/">November 2006</option>
507 <option value="http://defaria.com/blogs/Status/2006/10/">October 2006</option>
511 <option value="http://defaria.com/blogs/Status/2006/09/">September 2006</option>
515 <option value="http://defaria.com/blogs/Status/2006/07/">July 2006</option>
519 <option value="http://defaria.com/blogs/Status/2006/06/">June 2006</option>
523 <option value="http://defaria.com/blogs/Status/2006/05/">May 2006</option>
527 <option value="http://defaria.com/blogs/Status/2006/04/">April 2006</option>
531 <option value="http://defaria.com/blogs/Status/2006/03/">March 2006</option>
535 <option value="http://defaria.com/blogs/Status/2006/02/">February 2006</option>
539 <option value="http://defaria.com/blogs/Status/2006/01/">January 2006</option>
543 <option value="http://defaria.com/blogs/Status/2005/12/">December 2005</option>
547 <option value="http://defaria.com/blogs/Status/2005/11/">November 2005</option>
551 <option value="http://defaria.com/blogs/Status/2005/10/">October 2005</option>
555 <option value="http://defaria.com/blogs/Status/2005/09/">September 2005</option>
559 <option value="http://defaria.com/blogs/Status/2005/08/">August 2005</option>
563 <option value="http://defaria.com/blogs/Status/2005/07/">July 2005</option>
567 <option value="http://defaria.com/blogs/Status/2005/06/">June 2005</option>
571 <option value="http://defaria.com/blogs/Status/2005/05/">May 2005</option>
575 <option value="http://defaria.com/blogs/Status/2005/04/">April 2005</option>
579 <option value="http://defaria.com/blogs/Status/2005/03/">March 2005</option>
583 <option value="http://defaria.com/blogs/Status/2005/02/">February 2005</option>
587 <option value="http://defaria.com/blogs/Status/2005/01/">January 2005</option>
591 <option value="http://defaria.com/blogs/Status/2004/12/">December 2004</option>
595 <option value="http://defaria.com/blogs/Status/2004/09/">September 2004</option>
599 <option value="http://defaria.com/blogs/Status/2004/08/">August 2004</option>
603 <option value="http://defaria.com/blogs/Status/2004/07/">July 2004</option>
607 <option value="http://defaria.com/blogs/Status/2004/06/">June 2004</option>
611 <option value="http://defaria.com/blogs/Status/2004/05/">May 2004</option>
615 <option value="http://defaria.com/blogs/Status/2004/04/">April 2004</option>
619 <option value="http://defaria.com/blogs/Status/2004/03/">March 2004</option>
623 <option value="http://defaria.com/blogs/Status/2004/02/">February 2004</option>
627 <option value="http://defaria.com/blogs/Status/2004/01/">January 2004</option>
631 <option value="http://defaria.com/blogs/Status/2003/12/">December 2003</option>
635 <option value="http://defaria.com/blogs/Status/2003/11/">November 2003</option>
643 <div class="widget-syndication widget section">
644 <div class="widget-content">
645 <p><img src="http://defaria.com/mt/mt-static/images/status_icons/feed.gif" alt="Subscribe to feed" width="9" height="9" /> <a href="http://defaria.com/blogs/Status/atom.xml">Subscribe to this blog's feed</a></p>
653 <footer id="footer" role="contentinfo">
654 <div id="footer-inner">
655 <div id="footer-content">
656 <nav role="navigation">
658 <li><a href="http://defaria.com/blogs/Status/">Home</a></li>
664 <p class="license">© Copyright 2016.</p>
665 <p class="poweredby">Powered by <a href="http://www.movabletype.org/">Movable Type</a></p>
671 <script src="http://defaria.com/mt/mt-static/jquery/jquery.min.js"></script>
672 <script src="http://defaria.com/blogs/Status/mt-theme-scale2.js"></script>