发信人: saka.bbs@bbs.neu.edu.cn (机器猫), 信区: cnlinux
标  题: perl(5)
发信站: 白山黑水BBS (Tue Apr  1 11:18:18 1997)
转信站: Lilac!ustcnews!ustcnews!sjtunews!neubbs
出  处: conger.neu.edu.cn

--------------582E483A7089
Content-Type: text/plain; charset=us-ascii; name="perldebug.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="perldebug.txt"

NAME

perldebug - Perl debugging

---------------------------------------------------------------------------

DESCRIPTION

First of all, have you tried using the -w switch?

---------------------------------------------------------------------------

Debugging

If you invoke Perl with a -d switch, your script will be run under the
debugger. However, the Perl debugger is not a separate program as it is in
a C environment. Instead, the -d flag tells the compiler to insert source
information into the pseudocode it's about to hand to the interpreter.
(That means your code must compile correctly for the debugger to work on
it.) Then when the interpreter starts up, it pre-loads a Perl library file
containing the debugger itself. The program will halt before the first
executable statement (but see below) and ask you for one of the following
commands:

h    Prints out a help message.

T    Stack trace. If you do bizarre things to your @_ arguments in a
     subroutine, the stack backtrace will not always show the original
     values.

s    Single step. Executes until it reaches the beginning of another
     statement.

n    Next. Executes over subroutine calls, until it reaches the beginning
     of the next statement.

f    Finish. Executes statements until it has finished the current
     subroutine.

c    Continue. Executes until the next breakpoint is reached.

c line
     Continue to the specified line. Inserts a one-time-only breakpoint at
     the specified line.

     Repeat last n or s.

l min+incr
     List incr+1 lines starting at min. If min is omitted, starts where
     last listing left off. If incr is omitted, previous value of incr is
     used.

l min-max
     List lines in the indicated range.

l line
     List just the indicated line.

l    List next window.

-    List previous window.

w line
     List window (a few lines worth of code) around line.

l subname
     List subroutine. If it's a long subroutine it just lists the
     beginning. Use ``l'' to list more.

/pattern/
     Regular expression search forward in the source code for pattern; the
     final / is optional.

?pattern?
     Regular expression search backward in the source code for pattern; the
     final ? is optional.

L    List lines that have breakpoints or actions.

S    Lists the names of all subroutines.

t    Toggle trace mode on or off.

b line [ condition ]
     Set a breakpoint. If line is omitted, sets a breakpoint on the line
     that is about to be executed. If a condition is specified, it is
     evaluated each time the statement is reached and a breakpoint is taken
     only if the condition is true. Breakpoints may only be set on lines
     that begin an executable statement. Conditions don't use if:

         b 237 $x > 30
         b 33 /pattern/i

b subname [ condition ]
     Set breakpoint at first executable line of subroutine.

d line
     Delete breakpoint. If line is omitted, deletes the breakpoint on the
     line that is about to be executed.

D    Delete all breakpoints.

a line command
     Set an action for line. A multiline command may be entered by
     backslashing the newlines. This command is Perl code, not another
     debugger command.

A    Delete all line actions.

< command
     Set an action to happen before every debugger prompt. A multiline
     command may be entered by backslashing the newlines.

> command
     Set an action to happen after the prompt when you've just given a
     command to return to executing the script. A multiline command may be
     entered by backslashing the newlines.

V package [symbols]
     Display all (or some) variables in package (defaulting to the main
     package) using a data pretty-printer (hashes show their keys and
     values so you see what's what, control characters are made printable,
     etc.). Make sure you don't put the type specifier (like $) there, just
     the symbol names, like this:

         V DB filename line

X [symbols]
     Same as as ``V'' command, but within the current package.

! number
     Redo a debugging command. If number is omitted, redoes the previous
     command.

! -number
     Redo the command that was that many commands ago.

H -number
     Display last n commands. Only commands longer than one character are
     listed. If number is omitted, lists them all.

q or ^D
     Quit. (``quit'' doesn't work for this.)

command
     Execute command as a Perl statement. A missing semicolon will be
     supplied.

p expr
     Same as print DB::OUT expr . The DB::OUT filehandle is opened to
     /dev/tty, regardless of where STDOUT may be redirected to.

Any command you type in that isn't recognized by the debugger will
be.directly executed ( eval 'd) as Perl code. Leading white space will
cause the debugger to think it's NOT a debugger command.

If you have any compile-time executable statements (code within a BEGIN
block or a use statement), these will NOT be stopped by debugger, although
require s will. From your own code, however, you can transfer control back
to the debugger using the following statement, which is harmless if the
debugger is not running:

    $DB::single = 1;

---------------------------------------------------------------------------

Customization

If you want to modify the debugger, copy perl5db.pl from the Perl library
to another name and modify it as necessary. You'll also want to set
environment variable PERL5DB to say something like this:

    BEGIN { require "myperl5db.pl" }

You can do some customization by setting up a .perldb file which contains
initialization code. For instance, you could make aliases like these (the
last one in particular most people seem to expect to be there):

    $DB::alias{'len'} = 's/^len(.*)/p length($1)/';
    $DB::alias{'stop'} = 's/^stop (at|in)/b/';
    $DB::alias{'.'} = 's/^\./p '
                    . '"\$DB::sub(\$DB::filename:\$DB::line):\t"'
                    . ',\$DB::dbline[\$DB::line]/' ;

---------------------------------------------------------------------------

Other resources

You did try the -w switch, didn't you?

---------------------------------------------------------------------------

BUGS

If your program exit() s or die() s, so does the debugger.

There's no builtin way to restart the debugger without exiting and coming
back into it. You could use an alias like this:

    $DB::alias{'rerun'} = 'exec "perl -d $DB::filename"';

But you'd lose any pending breakpoint information, and that might not be
the right path, etc.

--------------582E483A7089--

--
※ 来源:.白山黑水站 bbs.neu.edu.cn.[FROM: ygh@rose.dlut.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.064毫秒