Skip to content

Commit

Permalink
The attached patch adds to the debugger a capability I thought about
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
pjscott authored and Father Chrysostomos committed Nov 24, 2011
1 parent 0b75418 commit 611272b
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 14 deletions.
34 changes: 23 additions & 11 deletions lib/perl5db.pl
Expand Up @@ -2115,7 +2115,7 @@ =head2 GETTING READY TO EXECUTE COMMANDS
"$line:\t$dbline[$line]$after" );
}
else {
print_lineinfo($position);
depth_print_lineinfo($position);
}

# Scan forward, stopping at either the end or the next
Expand Down Expand Up @@ -2143,7 +2143,7 @@ =head2 GETTING READY TO EXECUTE COMMANDS
"$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)
Expand Down Expand Up @@ -2343,17 +2343,22 @@ =head4 C<q> - quit
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;
};

Expand Down Expand Up @@ -3456,7 +3461,9 @@ =head3 END OF COMMAND PARSING
=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' };
Expand Down Expand Up @@ -3880,6 +3887,11 @@ sub lsub : lvalue {
&$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,
Expand Down Expand Up @@ -7327,8 +7339,8 @@ sub sethelp {
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;
Expand Down Expand Up @@ -7468,7 +7480,7 @@ sub sethelp {
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
Expand Down Expand Up @@ -7519,8 +7531,8 @@ sub sethelp {
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'.
Expand Down
29 changes: 28 additions & 1 deletion lib/perl5db.t
Expand Up @@ -28,7 +28,7 @@ BEGIN {
}
}

plan(14);
plan(16);

my $rc_filename = '.perldb';

Expand Down Expand Up @@ -210,6 +210,33 @@ EOF
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

{
Expand Down
21 changes: 21 additions & 0 deletions lib/perl5db/t/rt-104168
@@ -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;
8 changes: 6 additions & 2 deletions pod/perldebug.pod
Expand Up @@ -269,15 +269,19 @@ X<debugger command, S>

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
Expand Down

0 comments on commit 611272b

Please sign in to comment.