perl - 具有可读子例程参数的堆栈跟踪

标签 perl debugging 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

我想看

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

换句话说,在堆栈跟踪中替换“ARRAY(0x..)”和“HASH(0x..)”

通过它们的实际有用值。

最佳答案

通过设置您自己的信号处理程序,您可以自定义输出,而无需更改抛出错误的方式。 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

这会生成如下输出:

something bad happened at ./dietest.pl line 41.
    during call to stuff::foo() at dietest.pl:46
    during call to things::bar({
        'fruit' => [
                     'apple',
                     'orange',
                     'pear'
                   ],
        'veggies' => [
                       'peas',
                       'carrots'
                     ]
      }
      [
        0,
        1,
        2
      ]
) at dietest.pl:36
something bad happened at ./dietest.pl line 41.

关于perl - 具有可读子例程参数的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6253952/

相关文章:

eclipse - 如何使 Eclipse 与 `perlbrew` 一起工作?

visual-studio - 一旦调试开始,Visual Studio 就会从应用程序中分离

debugging - 如何在 Vim 中找出某个快捷键触发了哪个命令

android - 更新后应用强制不断关闭

java - 尝试在空对象引用上调用接口(interface)方法 'boolean java.util.List.add(java.lang.Object)'

perl - 如何使用 Tcl 和 TclApp 为 Win32 编写 COM EXE?

perl - 为什么我对包子的本地化重新定义没有生效?

perl cgi - 更改临时上传文件的位置

sharepoint - 调试 SharePoint 2007 代码

java - 如何从调用者的范围抛出异常?