Perl-Devel::StackTrace帧的逆序
我试图使用Perl模块来显示带有堆栈跟踪的错误,帧从错误源的底部到顶部显示,是否有办法颠倒顺序,在顶部显示错误源帧,因为这是您需要知道的第一件事,如果需要,请跟踪到底部 下面是重现问题的测试代码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
#!/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()