Perl Devel :: StackTrace帧的逆序

时间:2014-08-01 21:55:37

标签: perl

我正在尝试使用Perl模块Devel::StackTrace来显示堆栈跟踪错误,帧显示在错误源的底部到顶部,是否有一种方法可以反转此顺序以显示错误源顶部的框架,因为这是您需要知道的第一件事,然后在需要时跟踪跟踪。

以下是重现该问题的测试代码。

#!/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

1 个答案:

答案 0 :(得分:1)

在查看模块Devel::StackTrace源代码后,我能够回答我的问题。 该模块具有方法frames,其中它返回或设置帧。因此,在调用as_stringas_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;

它完全符合我的要求。

相关问题