如何在Perl中获取堆栈跟踪?在Perl中获取堆栈跟踪?
21
A
回答
14
有许多有用的,cor e和基于CPAN的工具来生成堆栈跟踪(如其他答案所示)。但是,如果您想自己推出,请查看caller
内置。您可以使用它沿着堆栈走,看看到底发生了什么。
31
Carp::confess
(来自use Carp;
)会给你一个完整的堆栈跟踪作为错误的一部分。如果你只是需要它作为失败的一部分,confess
是你真正需要的。
每评论,这里有各种Carp
功能输出:
use strict;
use warnings;
use Carp qw/longmess cluck confess/;
sub foo {
&bar;
}
sub bar {
&baz;
}
sub baz {
shift->();
}
my %tests = (
'longmess' => sub { print longmess 'longmess' },
'cluck' => sub { cluck 'using cluck' },
'confess' => sub { confess 'using confess' },
);
while (my ($name, $sub) = each %tests) {
print "$name - before eval:\n";
eval {
foo($sub);
};
print "$name - before if:\n";
if ([email protected]) {
print "caught: [email protected]";
}
print "$name - done\n\n";
}
运行此脚本,您可以:
longmess - before eval: longmess at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a4d0)') called at - line 26 eval {...} called at - line 25 longmess - before if: longmess - done confess - before eval: confess - before if: caught: using confess at - line 20 main::__ANON__() called at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a3e0)') called at - line 26 eval {...} called at - line 25 confess - done cluck - before eval: using cluck at - line 19 main::__ANON__() called at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a434)') called at - line 26 eval {...} called at - line 25 cluck - before if: cluck - done
运行此脚本,但重定向STDOUT(从而表现出什么被印在STDERR) ,你得到:
using cluck at - line 19 main::__ANON__() called at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a434)') called at - line 26 eval {...} called at - line 25
31
对于调试需求,我喜欢Carp::Always。
perl -MCarp::Always my_script.pl
+1
我似乎需要做--MCarp =详细 – brianegge 2013-06-17 21:08:25
9
简单的方法使用caller
。 此代码不使用任何其他模块。只要在需要的地方包括它。
my $i = 1;
print "Stack Trace:\n";
while ((my @call_details = (caller($i++)))){
print $call_details[1].":".$call_details[2]." in function ".$call_details[3]."\n";
}
相关问题
- 1. 在VB6中获取堆栈跟踪
- 2. 从Visual Studio中获取堆栈跟踪
- 3. 提取从堆栈跟踪
- 4. 从ZendFramework获取完整堆栈跟踪
- 5. 从NullPointerException获取堆栈跟踪
- 6. 如何获取堆栈跟踪信息?
- 7. 从堆栈跟踪获取文件名
- 8. 使用cx_freeze获取Python堆栈跟踪
- 9. 获取堆栈跟踪参数的值?
- 10. 获取堆栈跟踪不通过USB
- 11. 从Perl获取堆栈跟踪“内存不足”错误
- 12. 在堆栈跟踪中捕获FileNotFound?
- 13. 从javascript堆栈跟踪中查找Java实际堆栈跟踪
- 14. 堆栈跟踪3
- 15. eclipse中的堆栈跟踪
- 16. VB6中的堆栈跟踪
- 17. CryptographicException在堆栈跟踪
- 18. 堆栈跟踪如何构建以及堆栈如何跟踪?
- 19. 如何获得正确的堆栈跟踪而不是反射堆栈跟踪?
- 20. 在堆栈跟踪中获取VB.NET行号
- 21. Python - 如何在新线程中获取堆栈跟踪
- 22. 在记录器中获取堆栈跟踪
- 23. 如何在OCaml中获取堆栈跟踪?
- 24. asp.net在浏览器中获取调试堆栈跟踪
- 25. 在堆栈跟踪中获取被调用的静态类名
- 26. 如何在Netbeans C++ IDE中获取堆栈跟踪
- 27. 如何在正常执行的.NET中获取堆栈跟踪?
- 28. 如何在WinRT中从C++获取堆栈跟踪?
- 29. 在Spark日志中获取完整堆栈跟踪
- 30. Java - 捕获所有堆栈跟踪
呃,或者使用'Devel :: StackTrace'。 – jrockway 2010-03-04 09:59:32
这是一个很好的选择。但它需要一个外部模块,它可能会或可能不会吸引人。为什么不把它作为答案发布,而不是downvoting? – 2010-03-04 19:03:13