堆栈跟踪与可读的子例程参数

jon*_*nny 10 debugging perl stack-trace

是否可以使用函数参数插值打印'精细'堆栈跟踪,例如Data :: Dumper?而不是最后一行

  check_module_auth_cookie........... disabled, ok.
  check_module_auth_ntlm............. no NTLM, ok.
  check_module_auth_opensso.......... no OpenSSO, ok.
  check_module_auth_tinysso.......... no TinySSO, ok.
 checksums........................... SDBM, ok.
  checksum hashes...
   /etc/lighttpd/sites/holding2/docroot/dbm/db_model.sdbm... Couldn't tie SDBM file /etc/lighttpd/sites/holding2/docroot/dbm/db_model.sdbm: ???????? ? ???????
 at /var/vh/eludia/Eludia/Content/Checksums/SDBM.pm line 52
        HOLDING::checksum_init('db_model') called at /var/vh/eludia/Eludia/Content/Checksums.pm line 195
        HOLDING::BEGIN() called at /var/vh/eludia/Eludia/Content/Checksums.pm line 206
        eval {...} called at /var/vh/eludia/Eludia/Content/Checksums.pm line 206
        require Eludia/Content/Checksums.pm called at /var/vh/eludia/Eludia.pm line 682
        HOLDING::check_module_checksums() called at /var/vh/eludia/Eludia.pm line 961
        HOLDING::BEGIN() called at /var/vh/eludia/Eludia/Content/Checksums.pm line 206
        eval {...} called at /var/vh/eludia/Eludia/Content/Checksums.pm line 206
        require Eludia.pm called at (eval 74) line 1
        eval 'package HOLDING; require Eludia;' called at /var/vh/eludia/Eludia/Loader.pm line 28
        Eludia::Loader::import('Eludia::Loader', 'ARRAY(0x41cf228)', 'HOLDING', 'HASH(0x41defc8)') called at (eval 72) line 7
Run Code Online (Sandbox Code Playgroud)

我想看看

        Eludia::Loader::import('Eludia::Loader', 
                    [
                                '/var/projects/app', 
                                '/var/projects/submodule'
                    ],
                    'HOLDING',
                    {
                                mail_configuration => {etc..}
                    }
        ) called at (eval 72) line 7
Run Code Online (Sandbox Code Playgroud)

换句话说,在stacktrace中替换'ARRAY(0x ..)'和'HASH(0x ..)'

通过他们实际有用的价值观.

Bra*_*ace 2

通过设置您自己的信号处理程序,您可以自定义输出,而无需更改抛出错误的方式。Devel ::StackTrace提供了对堆栈跟踪数据的便捷访问。

use Data::Dumper;
use Devel::StackTrace;

sub FatalErr {
    my ($message) = @_;

    my $trace = new Devel::StackTrace();
    $Data::Dumper::Terse = 1;

    print "$message";
    $trace->next_frame for 1..2;
    while (my $frame = $trace->next_frame) {
        my $arg_str = Dumper($frame->args);
        $arg_str =~ s/^/      /gm;
        $arg_str =~ s/^\s+//;
        printf '    during call to %1$s(%2$s) at %4$s:%5$s', $frame->subroutine, $arg_str, $frame->package, $frame->filename, $frame->line;
        print "\n";
    }
}

BEGIN{ $SIG{__DIE__} = \&FatalErr } # attaches the custom signal handler
Run Code Online (Sandbox Code Playgroud)

这会生成如下输出:

use Data::Dumper;
use Devel::StackTrace;

sub FatalErr {
    my ($message) = @_;

    my $trace = new Devel::StackTrace();
    $Data::Dumper::Terse = 1;

    print "$message";
    $trace->next_frame for 1..2;
    while (my $frame = $trace->next_frame) {
        my $arg_str = Dumper($frame->args);
        $arg_str =~ s/^/      /gm;
        $arg_str =~ s/^\s+//;
        printf '    during call to %1$s(%2$s) at %4$s:%5$s', $frame->subroutine, $arg_str, $frame->package, $frame->filename, $frame->line;
        print "\n";
    }
}

BEGIN{ $SIG{__DIE__} = \&FatalErr } # attaches the custom signal handler
Run Code Online (Sandbox Code Playgroud)