App-CLI-Plugin-StackTrace
view release on metacpan or search on metacpan
lib/App/CLI/Plugin/StackTrace.pm view on Meta::CPAN
$self->maybe::next::method(@argv);
}
sub _build_override_die_subroutine {
my $self = shift;
$SIG{__DIE__} = sub {
my $message = shift;
my @frames;
my $pkg = ref $self;
my $trace = Devel::StackTrace->new( ignore_package => \@IGNORE_PACKAGE );
my $stacktrace_message = <<STACKTRACE_MESSAGE;
$pkg
$message
----------
STACKTRACE_MESSAGE
chomp $message;
LOOP_OF_FRAMES:
while ( my $frame = $trace->next_frame ) {
my $start_line = $frame->line - $CONTEXT_LINE;
my $end_line = $frame->line + $CONTEXT_LINE;
if ($start_line < 1) {
$start_line = 1;
}
my @lines;
open my $fh, "<", $frame->filename or die sprintf("can not open %s. %s", $frame->filename, $!);
flock $fh, LOCK_EX or die sprintf("can not flock %s. %s", $frame->filename, $!);
while ( my $line = <$fh> ) {
chomp $line;
my $current_line = $.;
if ($current_line < $start_line || $current_line > $end_line) {
next;
}
my $mark = ($current_line == $frame->line) ? "*" : " ";
push @lines, sprintf(" %s %05d: %s", $mark, $current_line, $line);
}
close $fh or die sprintf("can not close %s. %s", $frame->filename, $!);
my $package = $frame->package;
my $filename = $frame->filename;
my $line = $frame->line;
my $lines = join "\n", @lines;
$stacktrace_message .= <<STACKTRACE_MESSAGE;
$package at $filename line $line.
$lines
==========
STACKTRACE_MESSAGE
} # end of LOOP_OF_FRAMES
( run in 0.635 second using v1.01-cache-2.11-cpan-df04353d9ac )