📄 perldebug.pod
字号:
=head1 NAMEX<debug> X<debugger>perldebug - Perl debugging=head1 DESCRIPTIONFirst of all, have you tried using the B<-w> switch?If you're new to the Perl debugger, you may prefer to readL<perldebtut>, which is a tutorial introduction to the debugger .=head1 The Perl DebuggerIf you invoke Perl with the B<-d> switch, your script runs under thePerl source debugger. This works like an interactive Perlenvironment, prompting for debugger commands that let you examinesource code, set breakpoints, get stack backtraces, change the values ofvariables, etc. This is so convenient that you often fire upthe debugger all by itself just to test out Perl constructsinteractively to see what they do. For example:X<-d> $ perl -d -e 42In Perl, the debugger is not a separate program the way it usually is in thetypical compiled environment. Instead, the B<-d> flag tells the compilerto insert source information into the parse trees it's about to hand offto the interpreter. That means your code must first compile correctlyfor the debugger to work on it. Then when the interpreter starts up, itpreloads a special Perl library file containing the debugger.The program will halt I<right before> the first run-time executablestatement (but see below regarding compile-time statements) and ask youto enter a debugger command. Contrary to popular expectations, wheneverthe debugger halts and shows you a line of code, it always displays theline it's I<about> to execute, rather than the one it has just executed.Any command not recognized by the debugger is directly executed(C<eval>'d) as Perl code in the current package. (The debuggeruses the DB package for keeping its own state information.)Note that the said C<eval> is bound by an implicit scope. As aresult any newly introduced lexical variable or any modifiedcapture buffer content is lost after the eval. The debugger is anice environment to learn Perl, but if you interactively experiment usingmaterial which should be in the same scope, stuff it in one line.For any text entered at the debugger prompt, leading and trailing whitespaceis first stripped before further processing. If a debugger commandcoincides with some function in your own program, merely precede thefunction with something that doesn't look like a debugger command, suchas a leading C<;> or perhaps a C<+>, or by wrapping it with parenthesesor braces.=head2 Calling the debuggerThere are several ways to call the debugger:=over 4=item perl -d program_nameOn the given program identified by C<program_name>.=item perl -d -e 0 Interactively supply an arbitrary C<expression> using C<-e>.=item perl -d:Ptkdb program_nameDebug a given program via the C<Devel::Ptkdb> GUI.=item perl -dt threaded_program_nameDebug a given program using threads (experimental).=back=head2 Debugger CommandsThe interactive debugger understands the following commands:=over 12=item hX<debugger command, h>Prints out a summary help message=item h [command]Prints out a help message for the given debugger command.=item h hThe special argument of C<h h> produces the entire help page, which is quite long.If the output of the C<h h> command (or any command, for that matter) scrollspast your screen, precede the command with a leading pipe symbol sothat it's run through your pager, as in DB> |h hYou may change the pager which is used via C<o pager=...> command.=item p exprX<debugger command, p>Same as C<print {$DB::OUT} expr> in the current package. In particular,because this is just Perl's own C<print> function, this means that nesteddata structures and objects are not dumped, unlike with the C<x> command.The C<DB::OUT> filehandle is opened to F</dev/tty>, regardless ofwhere STDOUT may be redirected to.=item x [maxdepth] exprX<debugger command, x>Evaluates its expression in list context and dumps out the result in apretty-printed fashion. Nested data structures are printed outrecursively, unlike the real C<print> function in Perl. When dumpinghashes, you'll probably prefer 'x \%h' rather than 'x %h'.See L<Dumpvalue> if you'd like to do this yourself.The output format is governed by multiple options described underL<"Configurable Options">.If the C<maxdepth> is included, it must be a numeral I<N>; the value isdumped only I<N> levels deep, as if the C<dumpDepth> option had beentemporarily set to I<N>.=item V [pkg [vars]]X<debugger command, V>Display all (or some) variables in package (defaulting to C<main>)using a data pretty-printer (hashes show their keys and values soyou see what's what, control characters are made printable, etc.).Make sure you don't put the type specifier (like C<$>) there, justthe symbol names, like this: V DB filename lineUse C<~pattern> and C<!pattern> for positive and negative regexes.This is similar to calling the C<x> command on each applicable var.=item X [vars]X<debugger command, X>Same as C<V currentpackage [vars]>.=item y [level [vars]]X<debugger command, y>Display all (or some) lexical variables (mnemonic: C<mY> variables)in the current scope or I<level> scopes higher. You can limit thevariables that you see with I<vars> which works exactly as it doesfor the C<V> and C<X> commands. Requires the C<PadWalker> moduleversion 0.08 or higher; will warn if this isn't installed. Outputis pretty-printed in the same style as for C<V> and the format iscontrolled by the same options.=item TX<debugger command, T> X<backtrace> X<stack, backtrace>Produce a stack backtrace. See below for details on its output.=item s [expr]X<debugger command, s> X<step>Single step. Executes until the beginning of anotherstatement, descending into subroutine calls. If an expression issupplied that includes function calls, it too will be single-stepped.=item n [expr]X<debugger command, n>Next. Executes over subroutine calls, until the beginningof the next statement. If an expression is supplied that includesfunction calls, those functions will be executed with stops beforeeach statement.=item rX<debugger command, r>Continue until the return from the current subroutine.Dump the return value if the C<PrintRet> option is set (default).=item <CR>Repeat last C<n> or C<s> command.=item c [line|sub]X<debugger command, c>Continue, optionally inserting a one-time-only breakpointat the specified line or subroutine.=item lX<debugger command, l>List next window of lines.=item l min+incrList C<incr+1> lines starting at C<min>.=item l min-maxList lines C<min> through C<max>. C<l -> is synonymous to C<->.=item l lineList a single line.=item l subnameList first window of lines from subroutine. I<subname> maybe a variable that contains a code reference.=item -X<debugger command, ->List previous window of lines.=item v [line]X<debugger command, v>View a few lines of code around the current line.=item .X<debugger command, .>Return the internal debugger pointer to the line lastexecuted, and print out that line.=item f filenameX<debugger command, f>Switch to viewing a different file or C<eval> statement. If I<filename>is not a full pathname found in the values of %INC, it is considereda regex.C<eval>ed strings (when accessible) are considered to be filenames:C<f (eval 7)> and C<f eval 7\b> access the body of the 7th C<eval>ed string(in the order of execution). The bodies of the currently executed C<eval>and of C<eval>ed strings that define subroutines are saved and thusaccessible.=item /pattern/Search forwards for pattern (a Perl regex); final / is optional.The search is case-insensitive by default.=item ?pattern?Search backwards for pattern; final ? is optional.The search is case-insensitive by default.=item L [abw]X<debugger command, L>List (default all) actions, breakpoints and watch expressions=item S [[!]regex]X<debugger command, S>List subroutine names [not] matching the regex.=item tX<debugger command, t>Toggle trace mode (see also the C<AutoTrace> option).=item t exprX<debugger command, t>Trace through execution of C<expr>.See L<perldebguts/"Frame Listing Output Examples"> for examples.=item bX<breakpoint>X<debugger command, b>Sets breakpoint on current line=item b [line] [condition]X<breakpoint>X<debugger command, b>Set a breakpoint before the given line. If a conditionis specified, it's evaluated each time the statement is reached: abreakpoint is taken only if the condition is true. Breakpoints mayonly be set on lines that begin an executable statement. Conditionsdon't use C<if>: b 237 $x > 30 b 237 ++$count237 < 11 b 33 /pattern/i=item b subname [condition]X<breakpoint>X<debugger command, b>Set a breakpoint before the first line of the named subroutine. I<subname> maybe a variable containing a code reference (in this case I<condition>is not supported).=item b postpone subname [condition]X<breakpoint>X<debugger command, b>Set a breakpoint at first line of subroutine after it is compiled.=item b load filenameX<breakpoint>X<debugger command, b>Set a breakpoint before the first executed line of the I<filename>,which should be a full pathname found amongst the %INC values.=item b compile subnameX<breakpoint>X<debugger command, b>Sets a breakpoint before the first statement executed after the specifiedsubroutine is compiled.=item B lineX<breakpoint>X<debugger command, B>Delete a breakpoint from the specified I<line>.=item B *X<breakpoint>X<debugger command, B>Delete all installed breakpoints.=item a [line] commandX<debugger command, a>Set an action to be done before the line is executed. If I<line> isomitted, set an action on the line about to be executed.The sequence of steps taken by the debugger is 1. check for a breakpoint at this line 2. print the line if necessary (tracing) 3. do any actions associated with that line 4. prompt user if at a breakpoint or in single-step 5. evaluate lineFor example, this will print out $foo every time line53 is passed: a 53 print "DB FOUND $foo\n"=item A lineX<debugger command, A>Delete an action from the specified line.=item A *X<debugger command, A>Delete all installed actions.=item w exprX<debugger command, w>Add a global watch-expression. We hope you know what one of theseis, because they're supposed to be obvious.=item W exprX<debugger command, W>Delete watch-expression=item W *X<debugger command, W>Delete all watch-expressions.=item oX<debugger command, o>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -