Perl-Devel::StackTrace帧的逆序

Perl-Devel::StackTrace帧的逆序,perl,Perl,我试图使用Perl模块来显示带有堆栈跟踪的错误,帧从错误源的底部到顶部显示,是否有办法颠倒顺序,在顶部显示错误源帧,因为这是您需要知道的第一件事,如果需要,请跟踪到底部 下面是重现问题的测试代码 #!/usr/bin/perl #!C:\perl\bin\perl.exe BEGIN { $|=1; use CGI::Carp qw(fatalsToBrowser set_message); use Devel::StackTrace; use Devel::S

我试图使用Perl模块来显示带有堆栈跟踪的错误,帧从错误源的底部到顶部显示,是否有办法颠倒顺序,在顶部显示错误源帧,因为这是您需要知道的第一件事,如果需要,请跟踪到底部

下面是重现问题的测试代码

#!/usr/bin/perl
#!C:\perl\bin\perl.exe

BEGIN {
    $|=1;
    use CGI::Carp qw(fatalsToBrowser set_message);
    use Devel::StackTrace;
    use Devel::StackTrace::AsHTML;
    use PadWalker;
    use Devel::StackTrace::WithLexicals;
    sub handle_errors {
        my $msg = shift;
        #my $trace = Devel::StackTrace->new(indent => 1, message => $msg);
        my $trace = Devel::StackTrace::WithLexicals->new(indent => 1, message => $msg);
        #print $trace->as_html;
        print $trace->as_string;
    }
    set_message(\&handle_errors);
}

show_error();

exit;
以下是文本格式错误消息:

Undefined subroutine &main::show_error called at C:/apache/htdocs/tests/test.cgi line 24.
     at C:\apache\htdocs\tests\test.cgi line 17
        main::handle_errors('Undefined subroutine &main::show_error called at C:/apache/htdocs/tests/test.cgi line 24.^J') called at C:\perl\site\lib\CGI\Carp.pm line 525
        eval {...} at C:\perl\site\lib\CGI\Carp.pm line 524
        CGI::Carp::fatalsToBrowser('Undefined subroutine &main::show_error called at C:/apache/htdocs/tests/test.cgi line 24.^J') called at C:\perl\site\lib\CGI\Carp.pm line 444
        CGI::Carp::die('Undefined subroutine &main::show_error called at C:/apache/htdocs/tests/test.cgi line 24.^J') called at C:\apache\htdocs\tests\test.cgi line 24

在查看模块
Devel::StackTrace
源代码之后,我能够回答我的问题。 模块具有方法
frames
,返回或设置帧。因此,在调用
as_string
as_html
方法之前,我简单地颠倒了顺序:

$trace->frames(reverse $trace->frames);
以下是解决方案的修改代码:

#!/usr/bin/perl
#!C:\perl\bin\perl.exe

BEGIN {
    $|=1;
    use CGI::Carp qw(fatalsToBrowser set_message);
    use Devel::StackTrace;
    use Devel::StackTrace::AsHTML;
    use PadWalker;
    use Devel::StackTrace::WithLexicals;
    sub handle_errors {
        my $msg = shift;
        my $trace = Devel::StackTrace->new(indent => 1, message => "$msg\n");
        #my $trace = Devel::StackTrace::WithLexicals->new(indent => 1, message => $msg);
        $trace->frames(reverse $trace->frames);
        #print $trace->as_html;
        print $trace->as_string;
    }
    set_message(\&handle_errors);
}

show_error();

exit;

它完全符合我的要求。

您已经从上到下显示了堆栈帧(最近的帧位于堆栈顶部)。从“
$trace->as\u string(\%p)
在每个帧上从上到下调用
$frame->as\u string()?如果在函数
foo
中发生错误,您应该在这里查看,而不是在堆栈底部的某个函数中。如果您看到跟踪,则在C:\apache\htdocs\tests\test.cgi第24行调用的最后一个
是问题的根源,它应该在跟踪的顶部。所以您希望最后一件事情在顶部执行吗?这就是你所拥有的。如果调用
show_error()有十层深,这些十层会显示在调用
show\u error()