我可以让Perl不删除堆栈帧吗?

我可以让Perl不删除堆栈帧吗?,perl,stack-trace,Perl,Stack Trace,我最近一直在编写一些代码,以捕获整个代码库中的错误(例如,在Perl代码的最顶层执行try/catch)。令我苦恼的是,我发现Perl堆栈跟踪忽略了堆栈帧!嘎阿!我正在寻找这些堆栈帧消失的原因。caller()的文档说明堆栈帧可以“优化”。但真的,让他们离开真是太烦人了。有没有办法诱使Perl包含它们?这样做是否会受到性能处罚?下面是一个简单的例子。正如您将看到的,堆栈跟踪中既不包括bar()也不包括bletch()。一个可悲的遗漏,导致我不得不手工追踪代码 感激地接受任何见解 伦纳德 这里是f

我最近一直在编写一些代码,以捕获整个代码库中的错误(例如,在Perl代码的最顶层执行try/catch)。令我苦恼的是,我发现Perl堆栈跟踪忽略了堆栈帧!嘎阿!我正在寻找这些堆栈帧消失的原因。caller()的文档说明堆栈帧可以“优化”。但真的,让他们离开真是太烦人了。有没有办法诱使Perl包含它们?这样做是否会受到性能处罚?下面是一个简单的例子。正如您将看到的,堆栈跟踪中既不包括bar()也不包括bletch()。一个可悲的遗漏,导致我不得不手工追踪代码

感激地接受任何见解

伦纳德

这里是foo.pl

use strict;
use warnings;

use Devel::StackTrace;
use Try::Tiny;

foo();

sub foo {
    print "In foo\n";
    try {
        bar();
    }
    catch {
        my $trace = Devel::StackTrace->new();
        print $trace->as_string;
    };
}

sub bar {
    print "In bar\n";
    bletch();
    my $more_stuff = 123;
    return $more_stuff;
}

sub bletch {
    print "In bletch\n";
    my $not_so_defined;
    $not_so_defined->barf();
    print "Unlikely to be printed\n";

}
下面是运行foo.pl时打印的内容:

In foo
In bar
In bletch
Trace begun at foo.pl line 17
main::__ANON__('Can\'t call method "barf" on an undefined value at ./foo.pl line 32.^J') called at /vcm/home/apps/perl-5.12.1/lib/site_perl/5.12.1/Try/Tiny.pm line 100
Try::Tiny::try('CODE(0xf503a0)', 'Try::Tiny::Catch=REF(0x1035ca0)') called at foo.pl line 19
main::foo at foo.pl line 9

在我看来,似乎没有。至少,在调用堆栈中创建更深层次的堆栈帧(如在错误点),或者使用更少的hamfisty try/catch实现

Try::Tiny只是
eval
的一个非常薄的包装。这意味着,它基本上会评估
try
sub,然后运行
catch
sub,如果
$@
是真的。当
catch
子运行时,
try
“块”已经返回,堆栈帧已经消失。没有消失,只是消失了。
eval
的返回已终止其正在评估的堆栈帧。您真正剩下的只是
$@
中的错误信息

下面是一个简单的例子。正如您将看到的,堆栈跟踪中既不包括bar()也不包括bletch()

是的,因为在获取堆栈跟踪之前,您已经退出了
bar
bletch


创建一个
$SIG{{uuuuu DIE{uuuuuu}
处理程序。

是一个堆栈跟踪,在发生错误的位置上创建两个级别,实际期望为已经消失/返回的内容创建堆栈帧?“优化”是指
goto&foo。它们不是被移除的。一旦被说出来,就非常明显了。谢谢伦纳德