I don't know whether it's cluck or me or both, but this output seems weird at best. use Carp qw/cluck/; backtrace(); END { backtrace() } END { cluck "And now we're done" } BEGIN { cluck "Let's start it all rolling" } END { cluck "I was done first!" } sub backtrace { print "DUMP BACKTRACE:\n"; my $i = 0; while (my($pack, $file, $line, $sub) = caller($i++)) { print "\tCALLED: $pack $file $line $sub\n"; } } Makes: Let's start it all rolling at /tmp/x line 7 main::BEGIN() called at /tmp/x line 7 require 0 called at /tmp/x line 7 DUMP BACKTRACE: CALLED: main /tmp/x 3 main::backtrace I was done first! at /tmp/x line 8 main::END() called at /tmp/x line 0 require 0 called at /tmp/x line 0 And now we're done at /tmp/x line 6 main::END() called at /tmp/x line 0 require 0 called at /tmp/x line 0 DUMP BACKTRACE: CALLED: main /tmp/x 5 main::backtrace CALLED: main /tmp/x 0 main::END CALLED: main /tmp/x 0 (eval) --tomThread Next