Perl / perl5

đŸȘ The Perl programming language
https://dev.perl.org/perl5/
Other
1.98k stars 559 forks source link

Debugger patch - trace to max depth #11765

Closed p5pRT closed 12 years ago

p5pRT commented 13 years ago

Migrated from rt.perl.org#104168 (status was 'resolved')

Searchable as RT104168$

p5pRT commented 13 years ago

From @pjscott

The attached patch adds to the debugger a capability I thought about ages ago and which turned out to be absurdly easy to implement. It adds an optional parameter to the t(race) command\, a maximum number of stack frames to trace below the current one​:\, e.g.​:

  t 3 - turn tracing on\, trace up to 3 levels below current depth\, be silent below that   t 2 fnord() - trace up to 2 levels deep in execution of fnord()

Since it is backwards compatible I added it to the legacy command set as well\, but that's certainly debatable.

p5pRT commented 13 years ago

From @pjscott

Inline Patch ```diff --- lib/perl5db.pl.orig 2010-09-05 19:47:29.000000000 -0700 +++ lib/perl5db.pl 2011-11-21 01:42:49.000000000 -0800 @@ -2108,7 +2108,7 @@ "$line:\t$dbline[$line]$after" ); } else { - print_lineinfo($position); + print_lineinfo($position) if $stack_depth < $trace_to_depth; } # Scan forward, stopping at either the end or the next @@ -2136,7 +2136,7 @@ "$i:\t$dbline[$i]$after" ); } else { - print_lineinfo($incr_pos); + print_lineinfo($incr_pos) if $stack_depth < $trace_to_depth; } } ## end for ($i = $line + 1 ; $i... } ## end else [ if ($slave_editor) @@ -2336,17 +2336,21 @@ exit $?; }; -=head4 C - trace +=head4 C - trace [n] - trace [to n levels below current stack depth] Turn tracing on or off. Inverts the appropriate bit in C<$trace> (q.v.). +If level is specified, set C<$trace_to_depth>. =cut - $cmd =~ /^t$/ && do { + $cmd =~ /^t(?:\s+(\d+))?$/ && do { $trace ^= 1; local $\ = ''; + $trace_to_depth = $1 ? $stack_depth + $1 : 1E9; print $OUT "Trace = " - . ( ( $trace & 1 ) ? "on" : "off" ) . "\n"; + . ( ( $trace & 1 ) + ? ( $1 ? "on (to level $trace_to_depth)" : "on" ) + : "off" ) . "\n"; next CMD; }; @@ -3417,7 +3421,9 @@ =cut # t - turn trace on. - $cmd =~ s/^t\s/\$DB::trace |= 1;\n/; + $cmd =~ s/^t\s+(\d+)?/\$DB::trace |= 1;\n/ && do { + $trace_to_depth = $1 ? $stack_depth||0 + $1 : 1E9; + }; # s - single-step. Remember the last command was 's'. $cmd =~ s/^s\s/\$DB::single = 1;\n/ && do { $laststep = 's' }; @@ -7213,8 +7219,8 @@ BIB Search backwards for I; final B is optional. B [I] List actions and or breakpoints and or watch-expressions. B [[B]I] List subroutine names [not] matching I. -B Toggle trace mode. -B I Trace through execution of I. +B [I] Toggle trace mode (to max I levels below current stack depth). +B [I] I Trace through execution of I. B Sets breakpoint on current line) B [I] [I] Set breakpoint; I defaults to the current execution line; @@ -7354,7 +7360,7 @@ BIB BIB Search forw/backw B Return from subroutine B Show module versions B [I|I] Continue until position I B List break/watch/actions - B [...] Set debugger options B [I] Toggle trace [trace expr] + B [...] Set debugger options B [I] [I] Toggle trace [max depth] [trace expr] B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I] Do pre/post-prompt B [I|I|I] [I] Set breakpoint B<$prc> [I|I] Redo a previous command B I Delete a/all breakpoints B [I<-num>] Display last num commands B [I] I Do cmd before line @@ -7405,8 +7411,8 @@ 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] Toggle trace mode (to max I levels below current stack depth). +B [I] 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'. @@ -7529,7 +7535,7 @@ 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 [...] Set debugger options B [I] [I] Toggle trace [max depth] [trace expr] B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I] Do pre/post-prompt B [I|I|I] [I] Set breakpoint 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 --- pod/perldebug.pod.orig 2011-11-21 01:44:24.000000000 -0800 +++ pod/perldebug.pod 2011-11-21 01:46:01.000000000 -0800 @@ -270,16 +270,20 @@ List subroutine names [not] matching the regex. -=item t +=item t [n] X Toggle trace mode (see also the C option). +Optional argument is the maximum number of levels to trace below +the current one; anything deeper than that will be silent. -=item t expr +=item t [n] expr X Trace through execution of C. See L for examples. +Optional argument is the maximum number of levels to trace below +the current one; anything deeper than that will be silent. =item b X ```
p5pRT commented 13 years ago

From @shlomif

Preferably this patch should include some regression tests - add them to lib/perl5db.t .

Regards\,

— Shlomi Fish

p5pRT commented 13 years ago

The RT System itself - Status changed from 'new' to 'open'

p5pRT commented 13 years ago

From @pjscott

On 11/21/2011 7​:45 AM\, Shlomi Fish via RT wrote​:

Preferably this patch should include some regression tests - add them to lib/perl5db.t .

Thanks\, I took a closer look at that .t and found this process is easier than it used to be. Two patches attached - an incremental one\, and the combined patch. One of those work for you?

p5pRT commented 13 years ago

From @pjscott

Inline Patch ```diff --- lib/perl5db.t.orig 2011-11-21 09:59:40.000000000 -0800 +++ lib/perl5db.t 2011-11-21 10:21:57.000000000 -0800 @@ -27,7 +27,7 @@ } } -plan(9); +plan(11); sub rc { open RC, ">", ".perldb" or die $!; @@ -167,6 +167,36 @@ like($output, "All tests successful.", "[perl #66110]"); } + +# [perl 104168] level option for tracing +{ + rc( + qq| + &parse_options("NonStop=0 ReadLine=0 TTY=db.out LineInfo=db.out"); + \n|, + + qq| + sub afterinit { + push(\@DB::typeahead, + 't 2', + 'c', + 'q', + ); + }\n|, + ); + + my $output = runperl(switches => [ '-d' ], stderr => 1, progfile => '../lib/perl5db/t/rt-104168'); + my $contents; + { + local $/; + open I, "<", 'db.out' or die $!; + $contents = ; + close(I); + } + like($contents, qr/level 2/, "[perl #104168]"); + unlike($contents, qr/baz/, "[perl #104168]"); +} + # taint tests { --- /dev/null 2011-08-29 21:23:40.775006631 -0700 +++ lib/perl5db/t/rt-104168 2011-11-21 10:18:39.000000000 -0800 @@ -0,0 +1,21 @@ +#!/usr/bin/perl +# +# This code is used by lib/perl5db.t !!! +# + +foo(); + +sub foo { + bar(); +} + + +sub bar { + baz(); +} + +sub baz { + 1; +} + +1; ```
p5pRT commented 13 years ago

From @pjscott

Inline Patch ```diff --- lib/perl5db.pl.orig 2010-09-05 19:47:29.000000000 -0700 +++ lib/perl5db.pl 2011-11-21 01:42:49.000000000 -0800 @@ -2108,7 +2108,7 @@ "$line:\t$dbline[$line]$after" ); } else { - print_lineinfo($position); + print_lineinfo($position) if $stack_depth < $trace_to_depth; } # Scan forward, stopping at either the end or the next @@ -2136,7 +2136,7 @@ "$i:\t$dbline[$i]$after" ); } else { - print_lineinfo($incr_pos); + print_lineinfo($incr_pos) if $stack_depth < $trace_to_depth; } } ## end for ($i = $line + 1 ; $i... } ## end else [ if ($slave_editor) @@ -2336,17 +2336,21 @@ exit $?; }; -=head4 C - trace +=head4 C - trace [n] - trace [to n levels below current stack depth] Turn tracing on or off. Inverts the appropriate bit in C<$trace> (q.v.). +If level is specified, set C<$trace_to_depth>. =cut - $cmd =~ /^t$/ && do { + $cmd =~ /^t(?:\s+(\d+))?$/ && do { $trace ^= 1; local $\ = ''; + $trace_to_depth = $1 ? $stack_depth + $1 : 1E9; print $OUT "Trace = " - . ( ( $trace & 1 ) ? "on" : "off" ) . "\n"; + . ( ( $trace & 1 ) + ? ( $1 ? "on (to level $trace_to_depth)" : "on" ) + : "off" ) . "\n"; next CMD; }; @@ -3417,7 +3421,9 @@ =cut # t - turn trace on. - $cmd =~ s/^t\s/\$DB::trace |= 1;\n/; + $cmd =~ s/^t\s+(\d+)?/\$DB::trace |= 1;\n/ && do { + $trace_to_depth = $1 ? $stack_depth||0 + $1 : 1E9; + }; # s - single-step. Remember the last command was 's'. $cmd =~ s/^s\s/\$DB::single = 1;\n/ && do { $laststep = 's' }; @@ -7213,8 +7219,8 @@ BIB Search backwards for I; final B is optional. B [I] List actions and or breakpoints and or watch-expressions. B [[B]I] List subroutine names [not] matching I. -B Toggle trace mode. -B I Trace through execution of I. +B [I] Toggle trace mode (to max I levels below current stack depth). +B [I] I Trace through execution of I. B Sets breakpoint on current line) B [I] [I] Set breakpoint; I defaults to the current execution line; @@ -7354,7 +7360,7 @@ BIB BIB Search forw/backw B Return from subroutine B Show module versions B [I|I] Continue until position I B List break/watch/actions - B [...] Set debugger options B [I] Toggle trace [trace expr] + B [...] Set debugger options B [I] [I] Toggle trace [max depth] [trace expr] B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I] Do pre/post-prompt B [I|I|I] [I] Set breakpoint B<$prc> [I|I] Redo a previous command B I Delete a/all breakpoints B [I<-num>] Display last num commands B [I] I Do cmd before line @@ -7405,8 +7411,8 @@ 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] Toggle trace mode (to max I levels below current stack depth). +B [I] 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'. @@ -7529,7 +7535,7 @@ 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 [...] Set debugger options B [I] [I] Toggle trace [max depth] [trace expr] B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I] Do pre/post-prompt B [I|I|I] [I] Set breakpoint 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 --- pod/perldebug.pod.orig 2011-11-21 01:44:24.000000000 -0800 +++ pod/perldebug.pod 2011-11-21 01:46:01.000000000 -0800 @@ -270,16 +270,20 @@ List subroutine names [not] matching the regex. -=item t +=item t [n] X Toggle trace mode (see also the C option). +Optional argument is the maximum number of levels to trace below +the current one; anything deeper than that will be silent. -=item t expr +=item t [n] expr X Trace through execution of C. See L for examples. +Optional argument is the maximum number of levels to trace below +the current one; anything deeper than that will be silent. =item b X --- lib/perl5db.t.orig 2011-11-21 09:59:40.000000000 -0800 +++ lib/perl5db.t 2011-11-21 10:21:57.000000000 -0800 @@ -27,7 +27,7 @@ } } -plan(9); +plan(11); sub rc { open RC, ">", ".perldb" or die $!; @@ -167,6 +167,36 @@ like($output, "All tests successful.", "[perl #66110]"); } + +# [perl 104168] level option for tracing +{ + rc( + qq| + &parse_options("NonStop=0 ReadLine=0 TTY=db.out LineInfo=db.out"); + \n|, + + qq| + sub afterinit { + push(\@DB::typeahead, + 't 2', + 'c', + 'q', + ); + }\n|, + ); + + my $output = runperl(switches => [ '-d' ], stderr => 1, progfile => '../lib/perl5db/t/rt-104168'); + my $contents; + { + local $/; + open I, "<", 'db.out' or die $!; + $contents = ; + close(I); + } + like($contents, qr/level 2/, "[perl #104168]"); + unlike($contents, qr/baz/, "[perl #104168]"); +} + # taint tests { --- /dev/null 2011-08-29 21:23:40.775006631 -0700 +++ lib/perl5db/t/rt-104168 2011-11-21 10:18:39.000000000 -0800 @@ -0,0 +1,21 @@ +#!/usr/bin/perl +# +# This code is used by lib/perl5db.t !!! +# + +foo(); + +sub foo { + bar(); +} + + +sub bar { + baz(); +} + +sub baz { + 1; +} + +1; ```
p5pRT commented 13 years ago

From @shlomif

On Mon\, 21 Nov 2011 10​:27​:41 -0800 Peter Scott \Peter@&#8203;PSDT\.com wrote​:

On 11/21/2011 7​:45 AM\, Shlomi Fish via RT wrote​:

Preferably this patch should include some regression tests - add them to lib/perl5db.t .

Thanks\, I took a closer look at that .t and found this process is easier than it used to be. Two patches attached - an incremental one\, and the combined patch. One of those work for you?

Well\, patch.combined does not apply correctly against bleadperl (at least not for me)​:

[SHELL]

shlomif@​telaviv1​:\~/Download/unpack/perl/p5/git/perl$ patch -p0 \< ~/patch.combined patching file lib/perl5db.pl Hunk #1 succeeded at 2115 (offset 7 lines). Hunk #2 succeeded at 2143 (offset 7 lines). Hunk #3 succeeded at 2343 (offset 7 lines). Hunk #4 succeeded at 3460 (offset 39 lines). Hunk #5 succeeded at 7333 (offset 114 lines). Hunk #6 succeeded at 7474 (offset 114 lines). Hunk #7 succeeded at 7525 (offset 114 lines). Hunk #8 succeeded at 7649 (offset 114 lines). patching file pod/perldebug.pod Hunk #1 succeeded at 269 (offset -1 lines). patching file lib/perl5db.t Hunk #1 FAILED at 27. Hunk #2 succeeded at 210 (offset 43 lines). 1 out of 2 hunks FAILED -- saving rejects to file lib/perl5db.t.rej patching file lib/perl5db/t/rt-104168 shlomif@​telaviv1​:\~/Download/unpack/perl/p5/git/perl$ git branch * blead   perlipc-revamp   perlipc-revamp-take2   shlomif-xs-pod-work

[/SHELL]

Otherwise\, here are a few notes about it​:

  }   else { - print_lineinfo($position); + print_lineinfo($position) if $stack_depth \< $trace_to_depth;   }

  # Scan forward\, stopping at either the end or the next @​@​ -2136\,7 +2136\,7 @​@​   "$i​:\t$dbline[$i]$after" );   }   else { - print_lineinfo($incr_pos); + print_lineinfo($incr_pos) if $stack_depth \< $trace_to_depth;   }

There's some duplicate functionality here. You should extract a subroutine or a closure or whatever to encapsulate it​:

sub depth_print_lineinfo {   my ($contents) = @​_;   if ($stack_depth \< $trace_to_depth) {   print_lineinfo($contents);   }   return; }

Also\, the variable $trace_to_depth appeared out of the blue. Is it a global package-scope variable? I would suggest declaring it\, even at least with "use vars(...)".

- $cmd =~ /^t$/ && do { + $cmd =~ /^t(?​:\s+(\d+))?$/ && do {   $trace ^= 1;   local $\ = ''; + $trace_to_depth = $1 ? $stack_depth + $1 : 1E9;   print $OUT "Trace = " - . ( ( $trace & 1 ) ? "on" : "off" ) . "\n"; + . ( ( $trace & 1 ) + ? ( $1 ? "on (to level $trace_to_depth)" : "on" ) + : "off" ) . "\n";   next CMD;   };

The $trace_to_depth is out of indentation. Please check appropriate leading tabs and spaces.

Plus\, you shouldn't use $1 in the "print $OUT" statement. Set a lexical variable flag based on its presence and/or value and then use it.

- $cmd =~ s/^t\s/\$DB​::trace |= 1;\n/; + $cmd =~ s/^t\s+(\d+)?/\$DB​::trace |= 1;\n/ && do { + $trace_to_depth = $1 ? $stack_depth||0 + $1 : 1E9; + };

Again mixed indentation.

Otherwise looks fine.

Regards\,

  Shlomi Fish

--


Shlomi Fish http​://www.shlomifish.org/ Freecell Solver - http​://fc-solve.shlomifish.org/

In Soviet Russia\, every time you kill a kitten\, God masturbates.   — http​://linux.slashdot.org/comments.pl?sid=195378&cid=16009070

Please reply to list if it's a mailing list post - http​://shlom.in/reply .

p5pRT commented 13 years ago

From @shlomif

Begin forwarded message​:

Date​: Tue\, 22 Nov 2011 11​:01​:09 +0200 From​: Shlomi Fish \shlomif@&#8203;shlomifish\.org To​: Peter Scott \Peter@&#8203;PSDT\.com Cc​: perlbug-followup@​perl.org Subject​: Re​: [perl #104168] Debugger patch - trace to max depth

On Mon\, 21 Nov 2011 10​:27​:41 -0800 Peter Scott \Peter@&#8203;PSDT\.com wrote​:

On 11/21/2011 7​:45 AM\, Shlomi Fish via RT wrote​:

Preferably this patch should include some regression tests - add them to lib/perl5db.t .

Thanks\, I took a closer look at that .t and found this process is easier than it used to be. Two patches attached - an incremental one\, and the combined patch. One of those work for you?

Well\, patch.combined does not apply correctly against bleadperl (at least not for me)​:

[SHELL]

shlomif@​telaviv1​:\~/Download/unpack/perl/p5/git/perl$ patch -p0 \< ~/patch.combined patching file lib/perl5db.pl Hunk #1 succeeded at 2115 (offset 7 lines). Hunk #2 succeeded at 2143 (offset 7 lines). Hunk #3 succeeded at 2343 (offset 7 lines). Hunk #4 succeeded at 3460 (offset 39 lines). Hunk #5 succeeded at 7333 (offset 114 lines). Hunk #6 succeeded at 7474 (offset 114 lines). Hunk #7 succeeded at 7525 (offset 114 lines). Hunk #8 succeeded at 7649 (offset 114 lines). patching file pod/perldebug.pod Hunk #1 succeeded at 269 (offset -1 lines). patching file lib/perl5db.t Hunk #1 FAILED at 27. Hunk #2 succeeded at 210 (offset 43 lines). 1 out of 2 hunks FAILED -- saving rejects to file lib/perl5db.t.rej patching file lib/perl5db/t/rt-104168 shlomif@​telaviv1​:\~/Download/unpack/perl/p5/git/perl$ git branch * blead   perlipc-revamp   perlipc-revamp-take2   shlomif-xs-pod-work

[/SHELL]

Otherwise\, here are a few notes about it​:

  }   else { - print_lineinfo($position); + print_lineinfo($position) if $stack_depth \< $trace_to_depth;   }

  # Scan forward\, stopping at either the end or the next @​@​ -2136\,7 +2136\,7 @​@​   "$i​:\t$dbline[$i]$after" );   }   else { - print_lineinfo($incr_pos); + print_lineinfo($incr_pos) if $stack_depth \< $trace_to_depth; }

There's some duplicate functionality here. You should extract a subroutine or a closure or whatever to encapsulate it​:

sub depth_print_lineinfo {   my ($contents) = @​_;   if ($stack_depth \< $trace_to_depth) {   print_lineinfo($contents);   }   return; }

Also\, the variable $trace_to_depth appeared out of the blue. Is it a global package-scope variable? I would suggest declaring it\, even at least with "use vars(...)".

- $cmd =~ /^t$/ && do { + $cmd =~ /^t(?​:\s+(\d+))?$/ && do {   $trace ^= 1;   local $\ = ''; + $trace_to_depth = $1 ? $stack_depth + $1 : 1E9;   print $OUT "Trace = " - . ( ( $trace & 1 ) ? "on" : "off" ) . "\n"; + . ( ( $trace & 1 ) + ? ( $1 ? "on (to level $trace_to_depth)" : "on" ) + : "off" ) . "\n";   next CMD;   };

The $trace_to_depth is out of indentation. Please check appropriate leading tabs and spaces.

Plus\, you shouldn't use $1 in the "print $OUT" statement. Set a lexical variable flag based on its presence and/or value and then use it.

- $cmd =~ s/^t\s/\$DB​::trace |= 1;\n/; + $cmd =~ s/^t\s+(\d+)?/\$DB​::trace |= 1;\n/ && do { + $trace_to_depth = $1 ? $stack_depth||0 + $1 : 1E9; + };

Again mixed indentation.

Otherwise looks fine.

Regards\,

  Shlomi Fish

--


Shlomi Fish http​://www.shlomifish.org/ Freecell Solver - http​://fc-solve.shlomifish.org/

In Soviet Russia\, every time you kill a kitten\, God masturbates.   — http​://linux.slashdot.org/comments.pl?sid=195378&cid=16009070

Please reply to list if it's a mailing list post - http​://shlom.in/reply .

--


Shlomi Fish http​://www.shlomifish.org/ Stop Using MSIE - http​://www.shlomifish.org/no-ie/

* Backward compatibility is your worst enemy. * Backward compatibility is your users’ best friend.

Please reply to list if it's a mailing list post - http​://shlom.in/reply .

p5pRT commented 12 years ago

From @shlomif

Forwarding to the list\, as this message was sent to me alone.

Regards\,

  Shlomi Fish

Begin forwarded message​:

Date​: Wed\, 23 Nov 2011 13​:43​:36 -0800 From​: Peter Scott \Peter@&#8203;PSDT\.com To​: Shlomi Fish \shlomif@&#8203;shlomifish\.org Subject​: Re​: [perl #104168] Debugger patch - trace to max depth

Thanks\, Shlomi.

On 11/22/2011 1​:01 AM\, Shlomi Fish wrote​:

Well\, patch.combined does not apply correctly against bleadperl (at least not for me)​: It seems someone's been busy on the debugger recently. I downloaded a fresh blead and attach a diff made from it. [/SHELL]

There's some duplicate functionality here. You should extract a subroutine or a closure or whatever to encapsulate it​: Good\, done. Also\, the variable $trace_to_depth appeared out of the blue. Is it a global package-scope variable? I would suggest declaring it\, even at least with "use vars(...)". Normally I would\, of course\, but the debugger is a minefield in that respect. There are no 'use vars' statements and no file-scoped lexicals (with one exception that looks like an accident). So I felt that treating this variable differently from all the others (see\, e.g.\, $laststep) would only invite unwarranted confusion and speculation as to what made it different from the rest. In other words\, when in Rome...

The $trace_to_depth is out of indentation. Please check appropriate leading tabs and spaces. Fixed. Plus\, you shouldn't use $1 in the "print $OUT" statement. Set a lexical variable flag based on its presence and/or value and then use it.

Done.

--


Shlomi Fish http​://www.shlomifish.org/ Stop Using MSIE - http​://www.shlomifish.org/no-ie/

Q2​: Busy people are unproductive. We are very productive and so we’re never busy.   — Star Trek\, “We\, the Living Dead” by Shlomi Fish

Please reply to list if it's a mailing list post - http​://shlom.in/reply .

p5pRT commented 12 years ago

From @shlomif

Inline Patch ```diff --- pod/perldebug.pod.orig 2011-11-22 16:28:16.000000000 -0800 +++ pod/perldebug.pod 2011-11-23 13:08:56.000000000 -0800 @@ -269,15 +269,19 @@ List subroutine names [not] matching the regex. -=item t +=item t [n] X Toggle trace mode (see also the C option). +Optional argument is the maximum number of levels to trace below +the current one; anything deeper than that will be silent. -=item t expr +=item t [n] expr X Trace through execution of C. +Optional first argument is the maximum number of levels to trace below +the current one; anything deeper than that will be silent. See L for examples. =item b --- lib/perl5db.pl.orig 2011-11-22 16:28:16.000000000 -0800 +++ lib/perl5db.pl 2011-11-23 13:26:34.000000000 -0800 @@ -2115,7 +2115,7 @@ "$line:\t$dbline[$line]$after" ); } else { - print_lineinfo($position); + depth_print_lineinfo($position); } # Scan forward, stopping at either the end or the next @@ -2143,7 +2143,7 @@ "$i:\t$dbline[$i]$after" ); } else { - print_lineinfo($incr_pos); + depth_print_lineinfo($incr_pos); } } ## end for ($i = $line + 1 ; $i... } ## end else [ if ($slave_editor) @@ -2343,17 +2343,22 @@ exit $?; }; -=head4 C - trace +=head4 C - trace [n] Turn tracing on or off. Inverts the appropriate bit in C<$trace> (q.v.). +If level is specified, set C<$trace_to_depth>. =cut - $cmd =~ /^t$/ && do { + $cmd =~ /^t(?:\s+(\d+))?$/ && do { + my $levels = $1; $trace ^= 1; local $\ = ''; + $trace_to_depth = $levels ? $stack_depth + $levels : 1E9; print $OUT "Trace = " - . ( ( $trace & 1 ) ? "on" : "off" ) . "\n"; + . ( ( $trace & 1 ) + ? ( $levels ? "on (to level $trace_to_depth)" : "on" ) + : "off" ) . "\n"; next CMD; }; @@ -3456,7 +3461,9 @@ =cut # t - turn trace on. - $cmd =~ s/^t\s/\$DB::trace |= 1;\n/; + $cmd =~ s/^t\s+(\d+)?/\$DB::trace |= 1;\n/ && do { + $trace_to_depth = $1 ? $stack_depth||0 + $1 : 1E9; + }; # s - single-step. Remember the last command was 's'. $cmd =~ s/^s\s/\$DB::single = 1;\n/ && do { $laststep = 's' }; @@ -3880,6 +3887,11 @@ &$sub; } +# Abstracting common code from multiple places elsewhere: +sub depth_print_lineinfo { + print_lineinfo( @_ ) if $stack_depth < $trace_to_depth; +} + =head1 EXTENDED COMMAND HANDLING AND THE COMMAND API In Perl 5.8.0, there was a major realignment of the commands and what they did, @@ -7327,8 +7339,8 @@ BIB Search backwards for I; final B is optional. B [I] List actions and or breakpoints and or watch-expressions. B [[B]I] List subroutine names [not] matching I. -B Toggle trace mode. -B I Trace through execution of I. +B [I] Toggle trace mode (to max I levels below current stack depth). +B [I] I Trace through execution of I. B Sets breakpoint on current line) B [I] [I] Set breakpoint; I defaults to the current execution line; @@ -7468,7 +7480,7 @@ BIB BIB Search forw/backw B Return from subroutine B Show module versions B [I|I] Continue until position I B List break/watch/actions - B [...] Set debugger options B [I] Toggle trace [trace expr] + B [...] Set debugger options B [I] [I] Toggle trace [max depth] ][trace expr] B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I] Do pre/post-prompt B [I|I|I] [I] Set breakpoint B<$prc> [I|I] Redo a previous command B I Delete a/all breakpoints B [I<-num>] Display last num commands B [I] I Do cmd before line @@ -7519,8 +7531,8 @@ 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] Toggle trace mode (to max I levels below current stack depth) . +B [I] 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'. --- lib/perl5db.t.orig 2011-10-04 10:55:47.000000000 -0700 +++ lib/perl5db.t 2011-11-23 13:38:06.000000000 -0800 @@ -28,7 +28,7 @@ } } -plan(14); +plan(16); my $rc_filename = '.perldb'; @@ -210,6 +210,33 @@ like($output, "All tests successful.", "[perl #66110]"); } +# [perl 104168] level option for tracing +{ + rc(<<'EOF'); +&parse_options("NonStop=0 TTY=db.out LineInfo=db.out"); + +sub afterinit { + push (@DB::typeahead, + 't 2', + 'c', + 'q', + ); + +} +EOF + + my $output = runperl(switches => [ '-d' ], stderr => 1, progfile => '../lib/perl5db/t/rt-104168'); + my $contents; + { + local $/; + open I, "<", 'db.out' or die $!; + $contents = ; + close(I); + } + like($contents, qr/level 2/, "[perl #104168]"); + unlike($contents, qr/baz/, "[perl #104168]"); +} + # taint tests { --- /dev/null 2011-08-29 21:23:40.775006631 -0700 +++ lib/perl5db/t/rt-104168 2011-11-22 18:12:11.000000000 -0800 @@ -0,0 +1,21 @@ +#!/usr/bin/perl +# +# This code is used by lib/perl5db.t !!! +# + +foo(); + +sub foo { + bar(); +} + + +sub bar { + baz(); +} + +sub baz { + 1; +} + +1; ```
p5pRT commented 12 years ago

From @shlomif

Hi Peter\,

On Thu\, 24 Nov 2011 09​:09​:37 +0200 Shlomi Fish \shlomif@&#8203;shlomifish\.org wrote​:

Thanks\, Shlomi.

On 11/22/2011 1​:01 AM\, Shlomi Fish wrote​:

Well\, patch.combined does not apply correctly against bleadperl (at least not for me)​: It seems someone's been busy on the debugger recently. I downloaded a fresh blead and attach a diff made from it.

Well\, next time you can use the "git diff" command.

[/SHELL]

There's some duplicate functionality here. You should extract a subroutine or a closure or whatever to encapsulate it​: Good\, done. Also\, the variable $trace_to_depth appeared out of the blue. Is it a global package-scope variable? I would suggest declaring it\, even at least with "use vars(...)". Normally I would\, of course\, but the debugger is a minefield in that respect. There are no 'use vars' statements and no file-scoped lexicals (with one exception that looks like an accident). So I felt that treating this variable differently from all the others (see\, e.g.\, $laststep) would only invite unwarranted confusion and speculation as to what made it different from the rest. In other words\, when in Rome...

OK.

The $trace_to_depth is out of indentation. Please check appropriate leading tabs and spaces. Fixed.

OK.

Plus\, you shouldn't use $1 in the "print $OUT" statement. Set a lexical variable flag based on its presence and/or value and then use it.

Done.

Nice.

Well\, I have tested your patch on a local git branch. All tests pass except for t/porting/manifest.t and after I add the missing file to the "MANIFEST" file\, I'm getting this​:

\<\<\< Failed 2 tests out of 2170\, 99.91% okay.   porting/filenames.t   porting/manifest.t ### Since not all tests were successful\, you may want to run some of ### them individually and examine any diagnostic messages they produce. ### See the INSTALL document's section on "make test". ### You have a good chance to get more information by running ### ./perl harness ### in the 't' directory since most (>=80%) of the tests succeeded. ### You may have to set your dynamic library search path\, ### LD_LIBRARY_PATH\, to point to the build directory​: ### setenv LD_LIBRARY_PATH `pwd`; cd t; ./perl harness ### LD_LIBRARY_PATH=`pwd`; export LD_LIBRARY_PATH; cd t; ./perl harness ### export LD_LIBRARY_PATH=`pwd`; cd t; ./perl harness ### for csh-style shells\, like tcsh; or for traditional/modern ### Bourne-style shells\, like bash\, ksh\, and zsh\, respectively. u=4.62 s=1.20 cu=296.52 cs=23.06 scripts=2170 tests=487908 make​: *** [test] Error 1

I don't think any of this is your fault\, but I still don't know how to fix it. Is it documented anywhere?

Regards\,

  Shlomi Fish

--


Shlomi Fish http​://www.shlomifish.org/ http​://www.shlomifish.org/humour/ways_to_do_it.html

I invented the term Object‐Oriented\, and I can tell you I did not have C++ in mind. — Alan Kay (Attributed)

Please reply to list if it's a mailing list post - http​://shlom.in/reply .

p5pRT commented 12 years ago

From @cpansprout

On Wed Nov 23 23​:10​:19 2011\, shlomif@​shlomifish.org wrote​:

Date​: Wed\, 23 Nov 2011 13​:43​:36 -0800 From​: Peter Scott \Peter@&#8203;PSDT\.com To​: Shlomi Fish \shlomif@&#8203;shlomifish\.org Subject​: Re​: [perl #104168] Debugger patch - trace to max depth

Thank you. Applied as 611272bb.

--

Father Chrysostomos

p5pRT commented 12 years ago

@cpansprout - Status changed from 'open' to 'resolved'

p5pRT commented 12 years ago

From @cpansprout

On Thu Nov 24 00​:01​:37 2011\, shlomif@​shlomifish.org wrote​:

\<\<\< Failed 2 tests out of 2170\, 99.91% okay. porting/filenames.t porting/manifest.t ### Since not all tests were successful\, you may want to run some of ### them individually and examine any diagnostic messages they produce. ### See the INSTALL document's section on "make test". ### You have a good chance to get more information by running ### ./perl harness ### in the 't' directory since most (>=80%) of the tests succeeded. ### You may have to set your dynamic library search path\, ### LD_LIBRARY_PATH\, to point to the build directory​: ### setenv LD_LIBRARY_PATH `pwd`; cd t; ./perl harness ### LD_LIBRARY_PATH=`pwd`; export LD_LIBRARY_PATH; cd t; ./perl harness ### export LD_LIBRARY_PATH=`pwd`; cd t; ./perl harness ### for csh-style shells\, like tcsh; or for traditional/modern ### Bourne-style shells\, like bash\, ksh\, and zsh\, respectively. u=4.62 s=1.20 cu=296.52 cs=23.06 scripts=2170 tests=487908 make​: *** [test] Error 1

I don't think any of this is your fault\, but I still don't know how to fix it. Is it documented anywhere?

In the test names. :-)

I suspect you used spaces instead of tabs in MANIFEST.

You can get verbose test output with​:

cd t; ./perl TEST porting/{filenames\,manifest}.t

It cuts off output on the first failure.

--

Father Chrysostomos