From: Ilya Zakharevich Date: Wed, 26 Nov 1997 17:05:57 +0000 (-0500) Subject: Add 'W'atch command to debugger and improve help: X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=6027b9a35019f02a9b3e344c2f78856358da6033;p=p5sagit%2Fp5-mst-13.2.git Add 'W'atch command to debugger and improve help: Subject: 5.004_55: Debugger patch again p4raw-id: //depot/perl@317 --- diff --git a/lib/perl5db.pl b/lib/perl5db.pl index d5dbfbd..df56723 100644 --- a/lib/perl5db.pl +++ b/lib/perl5db.pl @@ -2,7 +2,7 @@ package DB; # Debugger for Perl 5.00x; perl5db.pl patch level: -$VERSION = 1.01; +$VERSION = 1.02; $header = "perl5db.pl version $VERSION"; # Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich) @@ -381,8 +381,29 @@ sub DB { } } my $was_signal = $signal; + if ($trace & 2) { + for (my $n = 0; $n <= $#to_watch; $n++) { + $evalarg = $to_watch[$n]; + my ($val) = &eval; # Fix context (&eval is doing array)? + $val = ( (defined $val) ? "'$val'" : 'undef' ); + if ($val ne $old_watch[$n]) { + $signal = 1; + print $OUT < is not a debugger command.\n"); } next CMD; }; $cmd =~ /^t$/ && do { - $trace = !$trace; - print $OUT "Trace = ".($trace?"on":"off")."\n"; + ($trace & 1) ? ($trace &= ~1) : ($trace |= 1); + print $OUT "Trace = " . + (($trace & 1) ? "on" : "off" ) . "\n"; next CMD; }; $cmd =~ /^S(\s+(!)?(.+))?$/ && do { $Srev = defined $2; $Spatt = $3; $Snocheck = ! defined $1; @@ -686,6 +708,14 @@ sub DB { last if $signal; } } + if ($trace & 2) { + print $OUT "Watch-expressions:\n"; + my $expr; + for $expr (@to_watch) { + print $OUT " $expr\n"; + last if $signal; + } + } next CMD; }; $cmd =~ /^b\b\s*load\b\s*(.*)/ && do { my $file = $1; $file =~ s/\s+$//; @@ -925,6 +955,18 @@ sub DB { $cmd =~ /^T$/ && do { print_trace($OUT, 1); # skip DB next CMD; }; + $cmd =~ /^W\s*$/ && do { + $trace &= ~2; + @to_watch = @old_watch = (); + next CMD; }; + $cmd =~ /^W\b\s*(.*)/s && do { + push @to_watch, $1; + $evalarg = $1; + my ($val) = &eval; + $val = (defined $val) ? "'$val'" : 'undef' ; + push @old_watch, $val; + $trace |= 2; + next CMD; }; $cmd =~ /^\/(.*)$/ && do { $inpat = $1; $inpat =~ s:([^\\])/$:$1:; @@ -1062,7 +1104,7 @@ sub DB { $cmd =~ s/^\|+\s*//; redo PIPE; }; # XXX Local variants do not work! - $cmd =~ s/^t\s/\$DB::trace = 1;\n/; + $cmd =~ s/^t\s/\$DB::trace |= 1;\n/; $cmd =~ s/^s\s/\$DB::single = 1;\n/ && do {$laststep = 's'}; $cmd =~ s/^n\s/\$DB::single = 2;\n/ && do {$laststep = 'n'}; } # PIPE: @@ -1176,6 +1218,7 @@ sub eval { } elsif ($onetimeDump eq 'methods') { methods($res[0]); } + @res; } sub postponed_sub { @@ -1678,135 +1721,147 @@ sub list_versions { sub sethelp { $help = " -T Stack trace. -s [expr] Single step [in expr]. -n [expr] Next, steps over subroutine calls [in expr]. - Repeat last n or s command. -r Return from current subroutine. -c [line|sub] Continue; optionally inserts a one-time-only breakpoint +B Stack trace. +B [I] Single step [in I]. +B [I] Next, steps over subroutine calls [in I]. +> Repeat last B or B command. +B Return from current subroutine. +B [I|I] Continue; optionally inserts a one-time-only breakpoint at the specified position. -l min+incr List incr+1 lines starting at min. -l min-max List lines min through max. -l line List single line. -l subname List first window of lines from subroutine. -l List next window of lines. -- List previous window of lines. -w [line] List window around line. -. Return to the executed line. -f filename Switch to viewing filename. Must be loaded. -/pattern/ Search forwards for pattern; final / is optional. -?pattern? Search backwards for pattern; final ? is optional. -L List all breakpoints and actions. -S [[!]pattern] List subroutine names [not] matching pattern. -t Toggle trace mode. -t expr Trace through execution of expr. -b [line] [condition] - Set breakpoint; line defaults to the current execution line; - condition breaks if it evaluates to true, defaults to '1'. -b subname [condition] +B IB<+>I List I+1 lines starting at I. +B IB<->I List lines I through I. +B I List single I. +B I List first window of lines from subroutine. +B List next window of lines. +B<-> List previous window of lines. +B [I] List window around I. +B<.> Return to the executed line. +B I Switch to viewing I. Must be loaded. +BIB Search forwards for I; final B is optional. +BIB Search backwards for I; final B is optional. +B List all breakpoints and actions. +B [[B]I] List subroutine names [not] matching I. +B Toggle trace mode. +B I Trace through execution of I. +B [I] [I] + Set breakpoint; I defaults to the current execution line; + I breaks if it evaluates to true, defaults to '1'. +B I [I] Set breakpoint at first line of subroutine. -b load filename Set breakpoint on `require'ing the given file. -b postpone subname [condition] +B B I Set breakpoint on `require'ing the given file. +B B I [I] Set breakpoint at first line of subroutine after it is compiled. -b compile subname +B B I Stop after the subroutine is compiled. -d [line] Delete the breakpoint for line. -D Delete all breakpoints. -a [line] command - Set an action to be done before the line is executed. - Sequence is: check for breakpoint, print line if necessary, - do action, prompt user if breakpoint or step, evaluate line. -A Delete all actions. -V [pkg [vars]] List some (default all) variables in package (default current). - Use ~pattern and !pattern for positive and negative regexps. -X [vars] Same as \"V currentpackage [vars]\". -x expr Evals expression in array context, dumps the result. -m expr Evals expression in array context, prints methods callable +B [I] Delete the breakpoint for I. +B Delete all breakpoints. +B [I] I + Set an action to be done before the I is executed. + Sequence is: check for breakpoint/watchpoint, print line + if necessary, do action, prompt user if necessary, + execute expression. +B Delete all actions. +B I Add a global watch-expression. +B Delete all watch-expressions. +B [I [I]] List some (default all) variables in package (default current). + Use B<~>I and BI for positive and negative regexps. +B [I] Same as \"B I [I]\". +B I Evals expression in array context, dumps the result. +B I Evals expression in array context, prints methods callable on the first element of the result. -m class Prints methods callable via the given class. -O [opt[=val]] [opt\"val\"] [opt?]... - Set or query values of options. val defaults to 1. opt can +B I Prints methods callable via the given class. +B [I[B<=>I]] [IB<\">IB<\">] [IB]... + Set or query values of options. I defaults to 1. I can be abbreviated. Several options can be listed. - recallCommand, ShellBang: chars used to recall command or spawn shell; - pager: program for output of \"|cmd\"; - tkRunning: run Tk while prompting (with ReadLine); - signalLevel warnLevel dieLevel: level of verbosity; - inhibit_exit Allows stepping off the end of the script. - The following options affect what happens with V, X, and x commands: - arrayDepth, hashDepth: print only first N elements ('' for all); - compactDump, veryCompact: change style of array and hash dump; - globPrint: whether to print contents of globs; - DumpDBFiles: dump arrays holding debugged files; - DumpPackages: dump symbol tables of packages; - quote, HighBit, undefPrint: change style of string dump; - Option PrintRet affects printing of return value after r command, - frame affects printing messages on entry and exit from subroutines. - AutoTrace affects printing messages on every possible breaking point. - maxTraceLen gives maximal length of evals/args listed in stack trace. - ornaments affects screen appearance of the command line. + I, I: chars used to recall command or spawn shell; + I: program for output of \"|cmd\"; + I: run Tk while prompting (with ReadLine); + I I I: level of verbosity; + I Allows stepping off the end of the script. + The following options affect what happens with B, B, and B commands: + I, I: print only first N elements ('' for all); + I, I: change style of array and hash dump; + I: whether to print contents of globs; + I: dump arrays holding debugged files; + I: dump symbol tables of packages; + I, I, I: change style of string dump; + Option I affects printing of return value after B command, + I affects printing messages on entry and exit from subroutines. + I affects printing messages on every possible breaking point. + I gives maximal length of evals/args listed in stack trace. + I affects screen appearance of the command line. During startup options are initialized from \$ENV{PERLDB_OPTS}. - You can put additional initialization options TTY, noTTY, - ReadLine, and NonStop there (or use `R' after you set them). -< command Define Perl command to run before each prompt. -<< command Add to the list of Perl commands to run before each prompt. -> command Define Perl command to run after each prompt. ->> command Add to the list of Perl commands to run after each prompt. -\{ commandline Define debugger command to run before each prompt. -\{{ commandline Add to the list of debugger commands to run before each prompt. -$prc number Redo a previous command (default previous command). -$prc -number Redo number'th-to-last command. -$prc pattern Redo last command that started with pattern. - See 'O recallCommand' too. -$psh$psh cmd Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)" + You can put additional initialization options I, I, + I, and I there (or use `B' after you set them). +B<<> I Define Perl command to run before each prompt. +B<<<> I Add to the list of Perl commands to run before each prompt. +B<>> I Define Perl command to run after each prompt. +B<>>B<>> I Add to the list of Perl commands to run after each prompt. +B<{> I Define debugger command to run before each prompt. +B<{{> I Add to the list of debugger commands to run before each prompt. +B<$prc> I Redo a previous command (default previous command). +B<$prc> I<-number> Redo number'th-to-last command. +B<$prc> I Redo last command that started with I. + See 'B I' too. +B<$psh$psh> I Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)" . ( $rc eq $sh ? "" : " -$psh [cmd] Run cmd in subshell (forces \"\$SHELL -c 'cmd'\")." ) . " - See 'O shellBang' too. -H -number Display last number commands (default all). -p expr Same as \"print {DB::OUT} expr\" in current package. -|dbcmd Run debugger command, piping DB::OUT to current pager. -||dbcmd Same as |dbcmd but DB::OUT is temporarilly select()ed as well. -\= [alias value] Define a command alias, or list current aliases. -command Execute as a perl statement in current package. -v Show versions of loaded modules. -R Pure-man-restart of debugger, some of debugger state +B<$psh> [I] Run I in subshell (forces \"\$SHELL -c 'cmd'\")." ) . " + See 'B I' too. +B I<-number> Display last number commands (default all). +B

I Same as \"I\" in current package. +B<|>I Run debugger command, piping DB::OUT to current pager. +B<||>I Same as B<|>I but DB::OUT is temporarilly select()ed as well. +B<\=> [I I] Define a command alias, or list current aliases. +I Execute as a perl statement in current package. +B Show versions of loaded modules. +B Pure-man-restart of debugger, some of debugger state and command-line options may be lost. Currently the following setting are preserved: - history, breakpoints and actions, debugger Options - and the following command-line options: -w, -I, -e. -h [db_command] Get help [on a specific debugger command], enter |h to page. -h h Summary of debugger commands. -q or ^D Quit. Set \$DB::finished to 0 to debug global destruction. + history, breakpoints and actions, debugger Bptions + and the following command-line options: I<-w>, I<-I>, I<-e>. +B [I] Get help [on a specific debugger command], enter B<|h> to page. +B Summary of debugger commands. +B or B<^D> Quit. Set \$DB::finished to 0 to debug global destruction. "; $summary = <<"END_SUM"; -List/search source lines: Control script execution: - l [ln|sub] List source code T Stack trace - - or . List previous/current line s [expr] Single step [in expr] - w [line] List around line n [expr] Next, steps over subs - f filename View source in file Repeat last n or s - /pattern/ ?patt? Search forw/backw r Return from subroutine - v Show versions of modules c [ln|sub] Continue until position -Debugger controls: L List break pts & actions - O [...] Set debugger options t [expr] Toggle trace [trace expr] - <[<] or {[{] [cmd] Do before prompt b [ln/event] [c] Set breakpoint - >[>] [cmd] Do after prompt b sub [c] Set breakpoint for sub - $prc [N|pat] Redo a previous command d [line] Delete a breakpoint - H [-num] Display last num commands D Delete all breakpoints - = [a val] Define/list an alias a [ln] cmd Do cmd before line - h [db_cmd] Get help on command A Delete all actions - |[|]dbcmd Send output to pager $psh\[$psh\] syscmd Run cmd in a subprocess - q or ^D Quit R Attempt a restart -Data Examination: expr Execute perl code, also see: s,n,t expr - x|m expr Evals expr in array context, dumps the result or lists methods. - p expr Print expression (uses script's current package). - S [[!]pat] List subroutine names [not] matching pattern - V [Pk [Vars]] List Variables in Package. Vars can be ~pattern or !pattern. - X [Vars] Same as \"V current_package [Vars]\". +I I + B [I|I] List source code B Stack trace + B<-> or B<.> List previous/current line B [I] Single step [in expr] + B [I] List around line B [I] Next, steps over subs + B I View source in file > Repeat last B or B + BIB BIB Search forw/backw B Return from subroutine + B Show versions of modules B [I|I] Continue until position +I B List break/watch/actions + B [...] Set debugger options B [I] Toggle trace [trace expr] + B<<>[B<<>] or B<{>[B<{>] [I] Do before prompt B [I|I] [I] Set breakpoint + B<>>[B<>>] [I] Do after prompt B I [I] Set breakpoint for sub + B<$prc> [I|I] Redo a previous command B [I] or B Delete a/all breakpoints + B [I<-num>] Display last num commands B [I] I Do cmd before line + B<=> [I I] Define/list an alias B I Add a watch expression + B [I] Get help on command B or B Delete all actions/watch + B<|>[B<|>]I Send output to pager B<$psh>\[B<$psh>\] I Run cmd in a subprocess + B or B<^D> Quit B Attempt a restart +I B Execute perl code, also see: B,B,B I + B|B I Evals expr in array context, dumps the result or lists methods. + B

I Print expression (uses script's current package). + B [[B]I] List subroutine names [not] matching pattern + B [I [I]] List Variables in Package. Vars can be ~pattern or !pattern. + B [I] Same as \"B I [I]\". END_SUM # ')}}; # Fix balance of Emacs parsing } +sub print_help { + my $message = shift; + if (@Term::ReadLine::TermCap::rl_term_set) { + $message =~ s/B<([^>]+|>)>/$Term::ReadLine::TermCap::rl_term_set[2]$1$Term::ReadLine::TermCap::rl_term_set[3]/g; + $message =~ s/I<([^>]+|>)>/$Term::ReadLine::TermCap::rl_term_set[0]$1$Term::ReadLine::TermCap::rl_term_set[1]/g; + } + print $OUT $message; +} + sub diesignal { local $frame = 0; local $doret = -2;