Debug Perl 6 programs

There are at least two useful debuggers available for Rakudo:

A command-line debugger frontend for Rakudo.

Simple tracing and debugging support for Perl 6 grammars

Please see the documentation for these programs for further information.

Historically others have existed and others are likely to be written in future, check the Perl 6 Modules website.

trace pragma

The trace pragma causes the program to print out step-by-step which lines get executed:

use trace;
sub foo { say "hi" }
# 2 (/tmp/script.p6 line 2) 
# sub foo { say "hi" } 
# 5 (/tmp/script.p6 line 3) 
# foo 
# 3 (/tmp/script.p6 line 2) 
# say "hi" 
# hi 

Dumper function dd

Note: this routine is a Rakudo-specific debugging feature and not standard Perl 6.

The Tiny Data Dumper. This function takes the input list of variables and notes them (on $*ERR) in an easy to read format, along with the name of the variable. Thus,

my $a = 42;
my %hash = "a" => 1"b" => 2"c" => 3;
dd %hash$a;
# %hash = ("a" => 1, "c" => 3, "b" => 2).hash, $a = 42 

to the standard error stream.

This is in spirit similar to Perl 5's Data::Dumper module.

Please note that dd will ignore named parameters. You can use a Capture or Array to force it to dump everything passed to it.

dd \((:a(1), :b(2)), :c(3));
dd [(:a(1), :b(2)), :c(3)];

If you don't specify any parameters at all, it will just print the type and name of the current subroutine / method to the standard error stream:

sub a { dd }a    # sub a 

This can be handy as a cheap trace function.

The Backtrace class

The Backtrace class gets the current call stack, and can return it as a string:

my $trace =;
sub inner { say}
sub outer { inner}
# perl6 /tmp/script.p6 
#   in sub inner at /tmp/script.p6 line 2 
#   in sub outer at /tmp/script.p6 line 3 
#   in block <unit> at /tmp/script.p6 line 4