Trace named Perl subroutine steps as one ordered replay panel.

callback step Named subroutines keep each transformation visible in replay while Perl stays in a single execution thread.

Callback Step Panel

base
callback_step_panel.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;

sub add_step {
    my ($value) = @_;
    return $value + 4;
}

sub double_step {
    my ($value) = @_;
    return $value * 2;
}

my $base = 6;
my $first = add_step($base);
my $second = double_step($first);

print "base=$base\n";
print "first=$first\n";
print "second=$second\n";
use strict;
use warnings;

sub add_step {
    my ($value) = @_;
    return $value + 4;
}

sub double_step {
    my ($value) = @_;
    return $value * 2;
}

my $base = 3;
my $first = add_step($base);
my $second = double_step($first);

print "base=$base\n";
print "first=$first\n";
print "second=$second\n";
use strict;
use warnings;

sub add_step {
    my ($value) = @_;
    return $value + 4;
}

sub double_step {
    my ($value) = @_;
    return $value * 2;
}

my $base = 9;
my $first = add_step($base);
my $second = double_step($first);

print "base=$base\n";
print "first=$first\n";
print "second=$second\n";
  1. $base ← 6

    14my $base→ 6 = 6; #@base=3, 915my $first = add_step($base6);16my $second = double_step($first);
  2. $value ← 6

    4sub add_step {5    my ($value→ 6) = @_;6    return $value6 + 4;7}
  3. $first ← 10

    14my $base = 6; #@base=3, 915my $first→ 10 = add_step($base6);16my $second = double_step($first10);
  4. $value ← 10

    9sub double_step {10    my ($value→ 10) = @_;11    return $value10 * 2;12}
  5. $second ← 20

    15my $first = add_step($base);16my $second→ 20 = double_step($first10);1718print "base=$base6\n";19print "first=$first10\n";20print "second=$second20\n";
    outputbase=6
    first=10
    second=20
  1. $base ← 3

    14my $base→ 3 = 3;15my $first = add_step($base3);16my $second = double_step($first);
  2. $value ← 3

    4sub add_step {5    my ($value→ 3) = @_;6    return $value3 + 4;7}
  3. $first ← 7

    14my $base = 3;15my $first→ 7 = add_step($base3);16my $second = double_step($first7);
  4. $value ← 7

    9sub double_step {10    my ($value→ 7) = @_;11    return $value7 * 2;12}
  5. $second ← 14

    15my $first = add_step($base);16my $second→ 14 = double_step($first7);1718print "base=$base3\n";19print "first=$first7\n";20print "second=$second14\n";
    outputbase=3
    first=7
    second=14
  1. $base ← 9

    14my $base→ 9 = 9;15my $first = add_step($base9);16my $second = double_step($first);
  2. $value ← 9

    4sub add_step {5    my ($value→ 9) = @_;6    return $value9 + 4;7}
  3. $first ← 13

    14my $base = 9;15my $first→ 13 = add_step($base9);16my $second = double_step($first13);
  4. $value ← 13

    9sub double_step {10    my ($value→ 13) = @_;11    return $value13 * 2;12}
  5. $second ← 26

    15my $first = add_step($base);16my $second→ 26 = double_step($first13);1718print "base=$base9\n";19print "first=$first13\n";20print "second=$second26\n";
    outputbase=9
    first=13
    second=26