Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Debugger patch - trace to max depth #11765

Closed
p5pRT opened this issue Nov 21, 2011 · 15 comments
Closed

Debugger patch - trace to max depth #11765

p5pRT opened this issue Nov 21, 2011 · 15 comments

Comments

@p5pRT
Copy link

p5pRT commented Nov 21, 2011

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

Searchable as RT104168$

@p5pRT
Copy link
Author

p5pRT commented Nov 21, 2011

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
Copy link
Author

p5pRT commented Nov 21, 2011

From @pjscott

Inline Patch
--- 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<t> - trace
+=head4 C<t> - 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 @@
 B<?>I<pattern>B<?>    Search backwards for I<pattern>; final B<?> is optional.
 B<L> [I<a|b|w>]        List actions and or breakpoints and or watch-expressions.
 B<S> [[B<!>]I<pattern>]    List subroutine names [not] matching I<pattern>.
-B<t>        Toggle trace mode.
-B<t> I<expr>        Trace through execution of I<expr>.
+B<t> [I<n>]       Toggle trace mode (to max I<n> levels below current stack depth).
+B<t> [I<n>] I<expr>        Trace through execution of I<expr>.
 B<b>        Sets breakpoint on current line)
 B<b> [I<line>] [I<condition>]
         Set breakpoint; I<line> defaults to the current execution line;
@@ -7354,7 +7360,7 @@
   B</>I<pattern>B</> B<?>I<patt>B<?>   Search forw/backw    B<r>           Return from subroutine
   B<M>           Show module versions        B<c> [I<ln>|I<sub>]  Continue until position
 I<Debugger controls:>                        B<L>           List break/watch/actions
-  B<o> [...]     Set debugger options        B<t> [I<expr>]    Toggle trace [trace expr]
+  B<o> [...]     Set debugger options        B<t> [I<n>] [I<expr>]    Toggle trace [max depth] [trace expr]
   B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
   B<$prc> [I<N>|I<pat>]   Redo a previous command     B<B> I<ln|*>      Delete a/all breakpoints
   B<H> [I<-num>]    Display last num commands   B<a> [I<ln>] I<cmd>  Do cmd before line
@@ -7405,8 +7411,8 @@
 B<?>I<pattern>B<?>    Search backwards for I<pattern>; final B<?> is optional.
 B<L>        List all breakpoints and actions.
 B<S> [[B<!>]I<pattern>]    List subroutine names [not] matching I<pattern>.
-B<t>        Toggle trace mode.
-B<t> I<expr>        Trace through execution of I<expr>.
+B<t> [I<n>]       Toggle trace mode (to max I<n> levels below current stack depth).
+B<t> [I<n>] I<expr>        Trace through execution of I<expr>.
 B<b> [I<line>] [I<condition>]
         Set breakpoint; I<line> defaults to the current execution line;
         I<condition> breaks if it evaluates to true, defaults to '1'.
@@ -7529,7 +7535,7 @@
   B</>I<pattern>B</> B<?>I<patt>B<?>   Search forw/backw    B<r>           Return from subroutine
   B<v>           Show versions of modules    B<c> [I<ln>|I<sub>]  Continue until position
 I<Debugger controls:>                        B<L>           List break/watch/actions
-  B<O> [...]     Set debugger options        B<t> [I<expr>]    Toggle trace [trace expr]
+  B<O> [...]     Set debugger options        B<t> [I<n>] [I<expr>]    Toggle trace [max depth] [trace expr]
   B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
   B<$prc> [I<N>|I<pat>]   Redo a previous command     B<d> [I<ln>] or B<D> Delete a/all breakpoints
   B<H> [I<-num>]    Display last num commands   B<a> [I<ln>] I<cmd>  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<debugger command, t>
 
 Toggle trace mode (see also the C<AutoTrace> 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<debugger command, t>
 
 Trace through execution of C<expr>.
 See L<perldebguts/"Frame Listing Output Examples"> 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<breakpoint>

@p5pRT
Copy link
Author

p5pRT commented Nov 21, 2011

From @shlomif

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

Regards,

— Shlomi Fish

@p5pRT
Copy link
Author

p5pRT commented Nov 21, 2011

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

@p5pRT
Copy link
Author

p5pRT commented Nov 21, 2011

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
Copy link
Author

p5pRT commented Nov 21, 2011

From @pjscott

Inline Patch
--- 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 = <I>;
+        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
Copy link
Author

p5pRT commented Nov 21, 2011

From @pjscott

Inline Patch
--- 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<t> - trace
+=head4 C<t> - 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 @@
 B<?>I<pattern>B<?>    Search backwards for I<pattern>; final B<?> is optional.
 B<L> [I<a|b|w>]        List actions and or breakpoints and or watch-expressions.
 B<S> [[B<!>]I<pattern>]    List subroutine names [not] matching I<pattern>.
-B<t>        Toggle trace mode.
-B<t> I<expr>        Trace through execution of I<expr>.
+B<t> [I<n>]       Toggle trace mode (to max I<n> levels below current stack depth).
+B<t> [I<n>] I<expr>        Trace through execution of I<expr>.
 B<b>        Sets breakpoint on current line)
 B<b> [I<line>] [I<condition>]
         Set breakpoint; I<line> defaults to the current execution line;
@@ -7354,7 +7360,7 @@
   B</>I<pattern>B</> B<?>I<patt>B<?>   Search forw/backw    B<r>           Return from subroutine
   B<M>           Show module versions        B<c> [I<ln>|I<sub>]  Continue until position
 I<Debugger controls:>                        B<L>           List break/watch/actions
-  B<o> [...]     Set debugger options        B<t> [I<expr>]    Toggle trace [trace expr]
+  B<o> [...]     Set debugger options        B<t> [I<n>] [I<expr>]    Toggle trace [max depth] [trace expr]
   B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
   B<$prc> [I<N>|I<pat>]   Redo a previous command     B<B> I<ln|*>      Delete a/all breakpoints
   B<H> [I<-num>]    Display last num commands   B<a> [I<ln>] I<cmd>  Do cmd before line
@@ -7405,8 +7411,8 @@
 B<?>I<pattern>B<?>    Search backwards for I<pattern>; final B<?> is optional.
 B<L>        List all breakpoints and actions.
 B<S> [[B<!>]I<pattern>]    List subroutine names [not] matching I<pattern>.
-B<t>        Toggle trace mode.
-B<t> I<expr>        Trace through execution of I<expr>.
+B<t> [I<n>]       Toggle trace mode (to max I<n> levels below current stack depth).
+B<t> [I<n>] I<expr>        Trace through execution of I<expr>.
 B<b> [I<line>] [I<condition>]
         Set breakpoint; I<line> defaults to the current execution line;
         I<condition> breaks if it evaluates to true, defaults to '1'.
@@ -7529,7 +7535,7 @@
   B</>I<pattern>B</> B<?>I<patt>B<?>   Search forw/backw    B<r>           Return from subroutine
   B<v>           Show versions of modules    B<c> [I<ln>|I<sub>]  Continue until position
 I<Debugger controls:>                        B<L>           List break/watch/actions
-  B<O> [...]     Set debugger options        B<t> [I<expr>]    Toggle trace [trace expr]
+  B<O> [...]     Set debugger options        B<t> [I<n>] [I<expr>]    Toggle trace [max depth] [trace expr]
   B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
   B<$prc> [I<N>|I<pat>]   Redo a previous command     B<d> [I<ln>] or B<D> Delete a/all breakpoints
   B<H> [I<-num>]    Display last num commands   B<a> [I<ln>] I<cmd>  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<debugger command, t>
 
 Toggle trace mode (see also the C<AutoTrace> 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<debugger command, t>
 
 Trace through execution of C<expr>.
 See L<perldebguts/"Frame Listing Output Examples"> 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<breakpoint>
--- 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 = <I>;
+        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
Copy link
Author

p5pRT commented Nov 22, 2011

From @shlomif

On Mon, 21 Nov 2011 10​:27​:41 -0800
Peter Scott <Peter@​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
Copy link
Author

p5pRT commented Nov 22, 2011

From @shlomif

Begin forwarded message​:

Date​: Tue, 22 Nov 2011 11​:01​:09 +0200
From​: Shlomi Fish <shlomif@​shlomifish.org>
To​: Peter Scott <Peter@​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@​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
Copy link
Author

p5pRT commented Nov 24, 2011

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@​PSDT.com>
To​: Shlomi Fish <shlomif@​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
Copy link
Author

p5pRT commented Nov 24, 2011

From @shlomif

Inline Patch
--- 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<debugger command, t>
 
 Toggle trace mode (see also the C<AutoTrace> 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<debugger command, t>
 
 Trace through execution of C<expr>.
+Optional first argument is the maximum number of levels to trace below
+the current one; anything deeper than that will be silent.
 See L<perldebguts/"Frame Listing Output Examples"> 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<t> - trace
+=head4 C<t> - 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 @@
 B<?>I<pattern>B<?>    Search backwards for I<pattern>; final B<?> is optional.
 B<L> [I<a|b|w>]        List actions and or breakpoints and or watch-expressions.
 B<S> [[B<!>]I<pattern>]    List subroutine names [not] matching I<pattern>.
-B<t>        Toggle trace mode.
-B<t> I<expr>        Trace through execution of I<expr>.
+B<t> [I<n>]       Toggle trace mode (to max I<n> levels below current stack depth).
+B<t> [I<n>] I<expr>        Trace through execution of I<expr>.
 B<b>        Sets breakpoint on current line)
 B<b> [I<line>] [I<condition>]
         Set breakpoint; I<line> defaults to the current execution line;
@@ -7468,7 +7480,7 @@
   B</>I<pattern>B</> B<?>I<patt>B<?>   Search forw/backw    B<r>           Return from subroutine
   B<M>           Show module versions        B<c> [I<ln>|I<sub>]  Continue until position
 I<Debugger controls:>                        B<L>           List break/watch/actions
-  B<o> [...]     Set debugger options        B<t> [I<expr>]    Toggle trace [trace expr]
+  B<o> [...]     Set debugger options        B<t> [I<n>] [I<expr>] Toggle trace [max depth] ][trace expr]
   B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
   B<$prc> [I<N>|I<pat>]   Redo a previous command     B<B> I<ln|*>      Delete a/all breakpoints
   B<H> [I<-num>]    Display last num commands   B<a> [I<ln>] I<cmd>  Do cmd before line
@@ -7519,8 +7531,8 @@
 B<?>I<pattern>B<?>    Search backwards for I<pattern>; final B<?> is optional.
 B<L>        List all breakpoints and actions.
 B<S> [[B<!>]I<pattern>]    List subroutine names [not] matching I<pattern>.
-B<t>        Toggle trace mode.
-B<t> I<expr>        Trace through execution of I<expr>.
+B<t> [I<n>]       Toggle trace mode (to max I<n> levels below current stack depth) .
+B<t> [I<n>] I<expr>        Trace through execution of I<expr>.
 B<b> [I<line>] [I<condition>]
         Set breakpoint; I<line> defaults to the current execution line;
         I<condition> 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 = <I>;
+        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
Copy link
Author

p5pRT commented Nov 24, 2011

From @shlomif

Hi Peter,

On Thu, 24 Nov 2011 09​:09​:37 +0200
Shlomi Fish <shlomif@​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
Copy link
Author

p5pRT commented Nov 24, 2011

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@​PSDT.com>
To​: Shlomi Fish <shlomif@​shlomifish.org>
Subject​: Re​: [perl #104168] Debugger patch - trace to max depth

Thank you. Applied as 611272b.

--

Father Chrysostomos

@p5pRT
Copy link
Author

p5pRT commented Nov 24, 2011

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

@p5pRT p5pRT closed this as completed Nov 24, 2011
@p5pRT
Copy link
Author

p5pRT commented Nov 24, 2011

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant