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><</code>, <code><<</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"><</span><span class="number">1</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>
</pre>
<pre>
<span class="variable">DB</span><span class="operator"><</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>
</pre>
<pre>
<span class="variable">DB</span><span class="operator"><</span><span class="number">3</span><span class="operator">></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"><</span><span class="number">4</span><span class="operator">></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"><</span><span class="number">5</span><span class="operator">></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 <d>(14)
14: CURLYX[0] {1,32767}(28)
16: OPEN1(18)
18: EXACT <e>(20)
20: STAR(23)
21: EXACT <f>(0)
23: EXACT <g>(25)
25: CLOSE1(27)
27: WHILEM[1/1](0)
28: NOTHING(29)
29: EXACT <h>(31)
31: ANYOF[ij](42)
42: EXACT <k>(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 + -
显示快捷键?