X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Fperl5db.pl;h=f0774bcdacaf78bfafdc92ae230bc2af10eea063;hb=7e3be867c805de9df8b4e2ab54f88f956419821c;hp=f38c3ffd3e5cb86defcdef6ef41e9a33c89a4ea5;hpb=56cbacacb6c634a626b06407cbd555bc1519a2d5;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/perl5db.pl b/lib/perl5db.pl index f38c3ff..f0774bc 100644 --- a/lib/perl5db.pl +++ b/lib/perl5db.pl @@ -2,8 +2,8 @@ package DB; # Debugger for Perl 5.00x; perl5db.pl patch level: -$VERSION = 0.9909; -$header = "perl5db.pl patch level $VERSION"; +$VERSION = 1.02; +$header = "perl5db.pl version $VERSION"; # Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich) # Latest version available: ftp://ftp.math.ohio-state.edu/pub/users/ilya/perl @@ -173,11 +173,11 @@ $trace = $signal = $single = 0; # Uninitialized warning suppression # (local $^W cannot help - other packages!). $inhibit_exit = $option{PrintRet} = 1; -@options = qw(hashDepth arrayDepth DumpDBFiles DumpPackages +@options = qw(hashDepth arrayDepth DumpDBFiles DumpPackages DumpReused compactDump veryCompact quote HighBit undefPrint globPrint PrintRet UsageOnly frame AutoTrace TTY noTTY ReadLine NonStop LineInfo maxTraceLen - recallCommand ShellBang pager tkRunning + recallCommand ShellBang pager tkRunning ornaments signalLevel warnLevel dieLevel inhibit_exit); %optionVars = ( @@ -185,6 +185,7 @@ $inhibit_exit = $option{PrintRet} = 1; arrayDepth => \$dumpvar::arrayDepth, DumpDBFiles => \$dumpvar::dumpDBFiles, DumpPackages => \$dumpvar::dumpPackages, + DumpReused => \$dumpvar::dumpReused, HighBit => \$dumpvar::quoteHighBit, undefPrint => \$dumpvar::printUndef, globPrint => \$dumpvar::globPrint, @@ -211,6 +212,7 @@ $inhibit_exit = $option{PrintRet} = 1; warnLevel => \&warnLevel, dieLevel => \&dieLevel, tkRunning => \&tkRunning, + ornaments => \&ornaments, ); %optionRequire = ( @@ -272,6 +274,10 @@ if (exists $ENV{PERLDB_RESTART}) { } @INC = get_list("PERLDB_INC"); @ini_INC = @INC; + $pretype = [get_list("PERLDB_PRETYPE")]; + $pre = [get_list("PERLDB_PRE")]; + $post = [get_list("PERLDB_POST")]; + @typeahead = get_list("PERLDB_TYPEAHEAD", @typeahead); } if ($notty) { @@ -285,12 +291,16 @@ if ($notty) { if (-e "/dev/tty") { $console = "/dev/tty"; - } elsif (-e "con" or $^O eq 'MSWin32') { + } elsif ($^O eq 'dos' or -e "con" or $^O eq 'MSWin32') { $console = "con"; } else { $console = "sys\$command"; } + if (($^O eq 'MSWin32') and ($emacs or defined $ENV{EMACS})) { + $console = undef; + } + # Around a bug: if (defined $ENV{OS2_SHELL} and ($emacs or $ENV{WINDOWID})) { # In OS/2 $console = undef; @@ -340,6 +350,8 @@ if (defined &afterinit) { # May be defined in $rcfile &afterinit(); } +$I_m_init = 1; + ############################################################ Subroutines sub DB { @@ -357,7 +369,7 @@ sub DB { &save; ($package, $filename, $line) = caller; $filename_ini = $filename; - $usercontext = '($@, $!, $,, $/, $\, $^W) = @saved;' . + $usercontext = '($@, $!, $^E, $,, $/, $\, $^W) = @saved;' . "package $package;"; # this won't let them modify, alas local(*dbline) = $main::{'_<' . $filename}; $max = $#dbline; @@ -370,8 +382,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 <' x $level) . " "))) { @@ -437,24 +471,25 @@ sub DB { eval "\$cmd =~ $alias{$i}", print $OUT $@ if $alias{$i}; $cmd =~ /^q$/ && ($exiting = 1) && exit 0; $cmd =~ /^h$/ && do { - print $OUT $help; + print_help($help); next CMD; }; $cmd =~ /^h\s+h$/ && do { - print $OUT $summary; + print_help($summary); next CMD; }; $cmd =~ /^h\s+(\S)$/ && do { my $asked = "\Q$1"; - if ($help =~ /^$asked/m) { - while ($help =~ /^($asked([\s\S]*?)\n)(\Z|[^\s$asked])/mg) { - print $OUT $1; + if ($help =~ /^(?:[IB]<)$asked/m) { + while ($help =~ /^((?:[IB]<)$asked([\s\S]*?)\n)(?!\s)/mg) { + print_help($1); } } else { - print $OUT "`$asked' is not a debugger command.\n"; + print_help("B<$asked> 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; @@ -674,6 +709,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+$//; @@ -796,9 +839,11 @@ sub DB { last CMD; }; $cmd =~ /^c\b\s*([\w:]*)\s*$/ && do { end_report(), next CMD if $finished and $level <= 1; - $i = $1; + $subname = $i = $1; if ($i =~ /\D/) { # subroutine name - ($file,$i) = (find_sub($i) =~ /^(.*):(.*)$/); + $subname = $package."::".$subname + unless $subname =~ /::/; + ($file,$i) = (find_sub($subname) =~ /^(.*):(.*)$/); $i += 0; if ($i) { $filename = $file; @@ -899,6 +944,10 @@ sub DB { } } set_list("PERLDB_POSTPONE", %postponed); + set_list("PERLDB_PRETYPE", @$pretype); + set_list("PERLDB_PRE", @$pre); + set_list("PERLDB_POST", @$post); + set_list("PERLDB_TYPEAHEAD", @typeahead); $ENV{PERLDB_RESTART} = 1; #print "$^X, '-d', @flags, @script, ($emacs ? '-emacs' : ()), @ARGS"; exec $^X, '-d', @flags, @script, ($emacs ? '-emacs' : ()), @ARGS; @@ -907,6 +956,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:; @@ -1044,14 +1105,14 @@ 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: $evalarg = "\$^D = \$^D | \$DB::db_stop;\n$cmd"; &eval; if ($onetimeDump) { $onetimeDump = undef; - } else { + } elsif ($term_pid == $$) { print $OUT "\n"; } } continue { # CMD: @@ -1080,7 +1141,7 @@ sub DB { &eval; } } # if ($single || $signal) - ($@, $!, $,, $/, $\, $^W) = @saved; + ($@, $!, $^E, $,, $/, $\, $^W) = @saved; (); } @@ -1112,7 +1173,11 @@ sub sub { $doret = -2 if $doret eq $#stack or $frame & 16; @ret; } else { - $ret = &$sub; + if (defined wantarray) { + $ret = &$sub; + } else { + &$sub; undef $ret; + }; $single |= pop(@stack); ($frame & 4 ? ( (print $LINEINFO ' ' x $#stack, "out "), @@ -1126,7 +1191,7 @@ sub sub { } sub save { - @saved = ($@, $!, $,, $/, $\, $^W); + @saved = ($@, $!, $^E, $,, $/, $\, $^W); $, = ""; $/ = "\n"; $\ = ""; $^W = 0; } @@ -1146,7 +1211,7 @@ sub eval { } my $at = $@; local $saved[0]; # Preserve the old value of $@ - eval "&DB::save"; + eval { &DB::save }; if ($at) { print $OUT $at; } elsif ($onetimeDump eq 'dump') { @@ -1154,6 +1219,7 @@ sub eval { } elsif ($onetimeDump eq 'methods') { methods($res[0]); } + @res; } sub postponed_sub { @@ -1162,8 +1228,8 @@ sub postponed_sub { my $offset = $1 || 0; # Filename below can contain ':' my ($file,$i) = (find_sub($subname) =~ /^(.*):(\d+)-.*$/); - $i += $offset; if ($i) { + $i += $offset; local *dbline = $main::{'_<' . $file}; local $^W = 0; # != 0 is magical below $had_breakpoints{$file}++; @@ -1374,6 +1440,30 @@ sub setterm { if ($term->Features->{setHistory} and "@hist" ne "?") { $term->SetHistory(@hist); } + ornaments($ornaments) if defined $ornaments; + $term_pid = $$; +} + +sub resetterm { # We forked, so we need a different TTY + $term_pid = $$; + if (defined &get_fork_TTY) { + &get_fork_TTY; + } elsif (not defined $fork_TTY + and defined $ENV{TERM} and $ENV{TERM} eq 'xterm' + and defined $ENV{WINDOWID} and defined $ENV{DISPLAY}) { + # Possibly _inside_ XTERM + open XT, q[3>&1 xterm -title 'Forked Perl debugger' -e sh -c 'tty 1>&3;\ + sleep 10000000' |]; + $fork_TTY = ; + chomp $fork_TTY; + } + if (defined $fork_TTY) { + TTY($fork_TTY); + undef $fork_TTY; + } else { + print $OUT "Forked, but do not know how to change a TTY.\n", + "Define \$DB::fork_TTY or get_fork_TTY().\n"; + } } sub readline { @@ -1499,29 +1589,39 @@ sub warn { } sub TTY { - if ($term) { - &warn("Too late to set TTY!\n") if @_; - } else { - $tty = shift if @_; - } + if (@_ and $term and $term->Features->{newTTY}) { + my ($in, $out) = shift; + if ($in =~ /,/) { + ($in, $out) = split /,/, $in, 2; + } else { + $out = $in; + } + open IN, $in or die "cannot open `$in' for read: $!"; + open OUT, ">$out" or die "cannot open `$out' for write: $!"; + $term->newTTY(\*IN, \*OUT); + $IN = \*IN; + $OUT = \*OUT; + return $tty = $in; + } elsif ($term and @_) { + &warn("Too late to set TTY, enabled on next `R'!\n"); + } + $tty = shift if @_; $tty or $console; } sub noTTY { if ($term) { - &warn("Too late to set noTTY!\n") if @_; - } else { - $notty = shift if @_; + &warn("Too late to set noTTY, enabled on next `R'!\n") if @_; } + $notty = shift if @_; $notty; } sub ReadLine { if ($term) { - &warn("Too late to set ReadLine!\n") if @_; - } else { - $rl = shift if @_; + &warn("Too late to set ReadLine, enabled on next `R'!\n") if @_; } + $rl = shift if @_; $rl; } @@ -1536,10 +1636,9 @@ sub tkRunning { sub NonStop { if ($term) { - &warn("Too late to set up NonStop mode!\n") if @_; - } else { - $runnonstop = shift if @_; + &warn("Too late to set up NonStop mode, enabled on next `R'!\n") if @_; } + $runnonstop = shift if @_; $runnonstop; } @@ -1563,6 +1662,16 @@ sub shellBang { $psh; } +sub ornaments { + if (defined $term) { + local ($warnLevel,$dieLevel) = (0, 1); + return '' unless $term->Features->{ornaments}; + eval { $term->ornaments(@_) } || ''; + } else { + $ornaments = shift; + } +} + sub recallCommand { if (@_) { $rc = quotemeta shift; @@ -1613,134 +1722,148 @@ 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. + 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: dump contents of \"reused\" addresses; + 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. -< 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; @@ -1762,18 +1885,15 @@ sub dbwarn { local $doret = -2; local $SIG{__WARN__} = ''; local $SIG{__DIE__} = ''; - eval { require Carp }; # If error/warning during compilation, - # require may be broken. - warn(@_, "\nPossible unrecoverable error"), warn("\nTry to decrease warnLevel `O'ption!\n"), return - unless defined &Carp::longmess; - #&warn("Entering dbwarn\n"); + eval { require Carp } if defined $^S; # If error/warning during compilation, + # require may be broken. + warn(@_, "\nCannot print stack trace, load with -MCarp option to see stack"), + return unless defined &Carp::longmess; my ($mysingle,$mytrace) = ($single,$trace); $single = 0; $trace = 0; my $mess = Carp::longmess(@_); ($single,$trace) = ($mysingle,$mytrace); - #&warn("Warning in dbwarn\n"); &warn($mess); - #&warn("Exiting dbwarn\n"); } sub dbdie { @@ -1782,28 +1902,24 @@ sub dbdie { local $SIG{__DIE__} = ''; local $SIG{__WARN__} = ''; my $i = 0; my $ineval = 0; my $sub; - #&warn("Entering dbdie\n"); - if ($dieLevel != 2) { - while ((undef,undef,undef,$sub) = caller(++$i)) { - $ineval = 1, last if $sub eq '(eval)'; - } - { + if ($dieLevel > 2) { local $SIG{__WARN__} = \&dbwarn; - &warn(@_) if $dieLevel > 2; # Ineval is false during destruction? - } - #&warn("dieing quietly in dbdie\n") if $ineval and $dieLevel < 2; - die @_ if $ineval and $dieLevel < 2; + &warn(@_); # Yell no matter what + return; + } + if ($dieLevel < 2) { + die @_ if $^S; # in eval propagate } - eval { require Carp }; # If error/warning during compilation, - # require may be broken. - die(@_, "\nUnrecoverable error") unless defined &Carp::longmess; + eval { require Carp } if defined $^S; # If error/warning during compilation, + # require may be broken. + die(@_, "\nCannot print stack trace, load with -MCarp option to see stack") + unless defined &Carp::longmess; # We do not want to debug this chunk (automatic disabling works # inside DB::DB, but not in Carp). my ($mysingle,$mytrace) = ($single,$trace); $single = 0; $trace = 0; my $mess = Carp::longmess(@_); ($single,$trace) = ($mysingle,$mytrace); - #&warn("dieing loudly in dbdie\n"); die $mess; } @@ -1828,7 +1944,8 @@ sub dieLevel { $SIG{__DIE__} = \&DB::dbdie; # if $dieLevel < 2; #$SIG{__DIE__} = \&DB::diehard if $dieLevel >= 2; print $OUT "Stack dump during die enabled", - ( $dieLevel == 1 ? " outside of evals" : ""), ".\n"; + ( $dieLevel == 1 ? " outside of evals" : ""), ".\n" + if $I_m_init; print $OUT "Dump printed too.\n" if $dieLevel > 2; } else { $SIG{__DIE__} = $prevdie; @@ -2006,7 +2123,9 @@ sub db_complete { return $term->filename_list($text); # filenames } -sub end_report { print $OUT "Use `q' to quit and `R' to restart. `h q' for details.\n" } +sub end_report { + print $OUT "Use `q' to quit or `R' to restart. `h q' for details.\n" +} END { $finished = $inhibit_exit; # So that some keys may be disabled. @@ -2018,7 +2137,7 @@ END { package DB::fake; sub at_exit { - "Debuggee terminated. Use `q' to quit and `R' to restart."; + "Debugged program terminated. Use `q' to quit or `R' to restart."; } package DB; # Do not trace this 1; below!