perldebguts.html

来自「perl教程」· HTML 代码 · 共 928 行 · 第 1/4 页

HTML
928
字号
<code>DB::parse_options(string)</code> parses debugger options; see
<em>pperldebug/Options</em> for a description of options recognized.</p>
</li>
<li>
<p><code>DB::dump_trace(skip[,count])</code> skips the specified number of frames
and returns a list containing information about the calling frames (all
of them, if <code>count</code> is missing).  Each entry is reference to a hash
with keys <code>context</code> (either <code>.</code>, <code>$</code>, or <code>@</code>), <a href="../../lib/Pod/perlfunc.html#item_sub"><code>sub</code></a> (subroutine
name, or info about <a href="../../lib/Pod/perlfunc.html#item_eval"><code>eval</code></a>), <code>args</code> (<a href="../../lib/Pod/perlfunc.html#item_undef"><code>undef</code></a> or a reference to
an array), <code>file</code>, and <code>line</code>.</p>
</li>
<li>
<p><code>DB::print_trace(FH, skip[, count[, short]])</code> prints
formatted info about caller frames.  The last two functions may be
convenient as arguments to <code>&lt;</code>, <code>&lt;&lt;</code> commands.</p>
</li>
</ul>
<p>Note that any variables and functions that are not documented in
this manpages (or in <a href="../../lib/Pod/perldebug.html">the perldebug manpage</a>) are considered for internal   
use only, and as such are subject to change without notice.</p>
<p>
</p>
<hr />
<h1><a name="frame_listing_output_examples">Frame Listing Output Examples</a></h1>
<p>The <code>frame</code> option can be used to control the output of frame 
information.  For example, contrast this expression trace:</p>
<pre>
 $ perl -de 42
 Stack dump during die enabled outside of evals.</pre>
<pre>
 Loading DB routines from perl5db.pl patch level 0.94
 Emacs support available.</pre>
<pre>
 Enter h or `h h' for help.</pre>
<pre>
 <span class="variable">main:</span>:(<span class="keyword">-e</span><span class="operator">:</span><span class="number">1</span><span class="operator">):</span>   <span class="number">0</span>
   <span class="variable">DB</span><span class="operator">&lt;</span><span class="number">1</span><span class="operator">&gt;</span> <span class="keyword">sub</span><span class="variable"> foo </span><span class="operator">{</span> <span class="number">14</span> <span class="operator">}</span>
</pre>
<pre>
   <span class="variable">DB</span><span class="operator">&lt;</span><span class="number">2</span><span class="operator">&gt;</span> <span class="keyword">sub</span><span class="variable"> bar </span><span class="operator">{</span> <span class="number">3</span> <span class="operator">}</span>
</pre>
<pre>
   <span class="variable">DB</span><span class="operator">&lt;</span><span class="number">3</span><span class="operator">&gt;</span> <span class="variable">t</span> <span class="keyword">print</span> <span class="variable">foo</span><span class="operator">()</span> <span class="operator">*</span> <span class="variable">bar</span><span class="operator">()</span>
    <span class="variable">main:</span>:(<span class="operator">(</span><span class="keyword">eval</span> <span class="number">172</span><span class="operator">):</span><span class="number">3</span><span class="operator">):</span>   <span class="keyword">print</span> <span class="variable">foo</span><span class="operator">()</span> <span class="operator">+</span> <span class="variable">bar</span><span class="operator">();</span>
    <span class="variable">main::foo</span><span class="operator">((</span><span class="keyword">eval</span> <span class="number">168</span><span class="operator">):</span><span class="number">2</span><span class="operator">):</span>
    <span class="variable">main::bar</span><span class="operator">((</span><span class="keyword">eval</span> <span class="number">170</span><span class="operator">):</span><span class="number">2</span><span class="operator">):</span>
    <span class="number">42</span>
</pre>
<p>with this one, once the <a href="../../lib/Pod/perlguts.html#item_o"><code>o</code></a>ption <code>frame=2</code> has been set:</p>
<pre>
   <span class="variable">DB</span><span class="operator">&lt;</span><span class="number">4</span><span class="operator">&gt;</span> <span class="variable">o</span> <span class="variable">f</span><span class="operator">=</span><span class="number">2</span>
                <span class="variable">frame</span> <span class="operator">=</span> <span class="string">'2'</span>
   <span class="variable">DB</span><span class="operator">&lt;</span><span class="number">5</span><span class="operator">&gt;</span> <span class="variable">t</span> <span class="keyword">print</span> <span class="variable">foo</span><span class="operator">()</span> <span class="operator">*</span> <span class="variable">bar</span><span class="operator">()</span>
    <span class="number">3</span><span class="operator">:</span>      <span class="variable">foo</span><span class="operator">()</span> <span class="operator">*</span> <span class="variable">bar</span><span class="operator">()</span>
    <span class="variable">entering</span> <span class="variable">main::foo</span>
     <span class="number">2</span><span class="operator">:</span>     <span class="keyword">sub</span><span class="variable"> foo </span><span class="operator">{</span> <span class="number">14</span> <span class="operator">};</span>
    <span class="variable">exited</span> <span class="variable">main::foo</span>
    <span class="variable">entering</span> <span class="variable">main::bar</span>
     <span class="number">2</span><span class="operator">:</span>     <span class="keyword">sub</span><span class="variable"> bar </span><span class="operator">{</span> <span class="number">3</span> <span class="operator">};</span>
    <span class="variable">exited</span> <span class="variable">main::bar</span>
    <span class="number">42</span>
</pre>
<p>By way of demonstration, we present below a laborious listing
resulting from setting your <code>PERLDB_OPTS</code> environment variable to
the value <code>f=n N</code>, and running <em>perl -d -V</em> from the command line.
Examples use various values of <a href="../../lib/Pod/perlguts.html#item_n"><code>n</code></a> are shown to give you a feel
for the difference between settings.  Long those it may be, this
is not a complete listing, but only excerpts.</p>
<ol>
<li>
<pre>
  entering main::BEGIN
   entering Config::BEGIN
    Package lib/Exporter.pm.
    Package lib/Carp.pm.
   Package lib/Config.pm.
   entering Config::TIEHASH
   entering Exporter::import
    entering Exporter::export
  entering Config::myconfig
   entering Config::FETCH
   entering Config::FETCH
   entering Config::FETCH
   entering Config::FETCH</pre>
<li>
<pre>
  entering main::BEGIN
   entering Config::BEGIN
    Package lib/Exporter.pm.
    Package lib/Carp.pm.
   exited Config::BEGIN
   Package lib/Config.pm.
   entering Config::TIEHASH
   exited Config::TIEHASH
   entering Exporter::import
    entering Exporter::export
    exited Exporter::export
   exited Exporter::import
  exited main::BEGIN
  entering Config::myconfig
   entering Config::FETCH
   exited Config::FETCH
   entering Config::FETCH
   exited Config::FETCH
   entering Config::FETCH</pre>
<li>
<pre>
  in  $=main::BEGIN() from /dev/null:0
   in  $=Config::BEGIN() from lib/Config.pm:2
    Package lib/Exporter.pm.
    Package lib/Carp.pm.
   Package lib/Config.pm.
   in  $=Config::TIEHASH('Config') from lib/Config.pm:644
   in  $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
    in  $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from li
  in  @=Config::myconfig() from /dev/null:0
   in  $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
   in  $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
   in  $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574
   in  $=Config::FETCH(ref(Config), 'PERL_SUBVERSION') from lib/Config.pm:574
   in  $=Config::FETCH(ref(Config), 'osname') from lib/Config.pm:574
   in  $=Config::FETCH(ref(Config), 'osvers') from lib/Config.pm:574</pre>
<li>
<pre>
  in  $=main::BEGIN() from /dev/null:0
   in  $=Config::BEGIN() from lib/Config.pm:2
    Package lib/Exporter.pm.
    Package lib/Carp.pm.
   out $=Config::BEGIN() from lib/Config.pm:0
   Package lib/Config.pm.
   in  $=Config::TIEHASH('Config') from lib/Config.pm:644
   out $=Config::TIEHASH('Config') from lib/Config.pm:644
   in  $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
    in  $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/
    out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/
   out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
  out $=main::BEGIN() from /dev/null:0
  in  @=Config::myconfig() from /dev/null:0
   in  $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
   out $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
   in  $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
   out $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
   in  $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574
   out $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574
   in  $=Config::FETCH(ref(Config), 'PERL_SUBVERSION') from lib/Config.pm:574</pre>
<li>
<pre>
  in  $=main::BEGIN() from /dev/null:0
   in  $=Config::BEGIN() from lib/Config.pm:2
    Package lib/Exporter.pm.
    Package lib/Carp.pm.
   out $=Config::BEGIN() from lib/Config.pm:0
   Package lib/Config.pm.
   in  $=Config::TIEHASH('Config') from lib/Config.pm:644
   out $=Config::TIEHASH('Config') from lib/Config.pm:644
   in  $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
    in  $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E
    out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E
   out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
  out $=main::BEGIN() from /dev/null:0
  in  @=Config::myconfig() from /dev/null:0
   in  $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574
   out $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574
   in  $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
   out $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574</pre>
<li>
<pre>
  in  $=CODE(0x15eca4)() from /dev/null:0
   in  $=CODE(0x182528)() from lib/Config.pm:2
    Package lib/Exporter.pm.
   out $=CODE(0x182528)() from lib/Config.pm:0
   scalar context return from CODE(0x182528): undef
   Package lib/Config.pm.
   in  $=Config::TIEHASH('Config') from lib/Config.pm:628
   out $=Config::TIEHASH('Config') from lib/Config.pm:628
   scalar context return from Config::TIEHASH:   empty hash
   in  $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
    in  $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
    out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
    scalar context return from Exporter::export: ''
   out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
   scalar context return from Exporter::import: ''</pre>
</ol>
<p>In all cases shown above, the line indentation shows the call tree.
If bit 2 of <code>frame</code> is set, a line is printed on exit from a
subroutine as well.  If bit 4 is set, the arguments are printed
along with the caller info.  If bit 8 is set, the arguments are
printed even if they are tied or references.  If bit 16 is set, the
return value is printed, too.</p>
<p>When a package is compiled, a line like this</p>
<pre>
    Package lib/Carp.pm.</pre>
<p>is printed with proper indentation.</p>
<p>
</p>
<hr />
<h1><a name="debugging_regular_expressions">Debugging regular expressions</a></h1>
<p>There are two ways to enable debugging output for regular expressions.</p>
<p>If your perl is compiled with <code>-DDEBUGGING</code>, you may use the
<strong>-Dr</strong> flag on the command line.</p>
<p>Otherwise, one can <code>use re 'debug'</code>, which has effects at
compile time and run time.  It is not lexically scoped.</p>
<p>
</p>
<h2><a name="compiletime_output">Compile-time output</a></h2>
<p>The debugging output at compile time looks like this:</p>
<pre>
  <span class="variable">Compiling</span> <span class="variable">REx</span> <span class="string">`[bc]d(ef*g)+h[ij]k$'
  size 45 Got 364 bytes for offset annotations.
  first at 1
  rarest char g at 0
  rarest char d at 0
     1: ANYOF[bc](12)
    12: EXACT &lt;d&gt;(14)
    14: CURLYX[0] {1,32767}(28)
    16:   OPEN1(18)
    18:     EXACT &lt;e&gt;(20)
    20:     STAR(23)
    21:       EXACT &lt;f&gt;(0)
    23:     EXACT &lt;g&gt;(25)
    25:   CLOSE1(27)
    27:   WHILEM[1/1](0)
    28: NOTHING(29)
    29: EXACT &lt;h&gt;(31)
    31: ANYOF[ij](42)
    42: EXACT &lt;k&gt;(44)
    44: EOL(45)
    45: END(0)
  anchored `</span><span class="variable">de</span><span class="string">' at 1 floating `gh'</span> <span class="variable">at</span> <span class="number">3</span><span class="operator">..</span><span class="number">2147483647</span> <span class="operator">(</span><span class="variable">checking</span> <span class="variable">floating</span><span class="operator">)</span> 
        <span class="variable">stclass</span> <span class="string">`ANYOF[bc]' minlen 7 
  Offsets: [45]
        1[4] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 5[1]

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?