我正在尝试使用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
答案 0 :(得分:1)
在查看模块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;
它完全符合我的要求。