Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 具有可读子例程参数的堆栈跟踪_Perl_Debugging_Stack Trace - Fatal编程技术网

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

Perl 具有可读子例程参数的堆栈跟踪,perl,debugging,stack-trace,Perl,Debugging,Stack Trace,是否可以使用函数参数打印“精细”stacktrace 插值的,如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........

是否可以使用函数参数打印“精细”stacktrace 插值的,如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
换句话说,在stacktrace中替换“数组(0x..”和“哈希(0x..”)


通过它们的实际有用值。

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

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
这将生成如下输出:

在./dietest.pl第41行发生了不好的事情。
在调用dietest.pl:46上的stuff::foo()期间
在调用things::bar期间({
“水果”=>[
“苹果”,
“橙色”,
“梨”
],
“蔬菜”=>[
“豌豆”,
“胡萝卜”
]
}
[
0,
1.
2.
]
)在dietest.pl:36
在/dietest.pl第41行发生了不好的事情。

我可以更改捕捉错误的方式(目前,通过eval{}和打印$@)。我还可以更改我的一些模块抛出错误(插入一些棘手的东西,而不是常规的骰子/鲤鱼)。但是有很多第三方的人因为我的无知而被使用,但是如何运行呢?这是我想要调试的独立脚本或部分代码,还是它的工作方式?感谢you@WakanTanka如果将上述代码添加到程序中,任何对
die“widget is unbrobbed”
的调用都将导致调用
FatalErr
,并以“widget is unbrobbed”作为参数。很抱歉,我仍然不明白(我是perl新手)。我已经尝试将您的代码添加到我要调试的代码中,并且打印堆栈跟踪('T'命令)看起来与以前一样。你所说的“小部件未被抢劫”是什么意思?我需要调用我想通过你的函数来调试的函数,这会起作用吗?你能说得更具体一点或者告诉我在哪里可以找到更多的信息吗?非常感谢你。是一个Perl内置函数。上面的代码是为了在正常运行程序时使用(为了更详细地解释它在哪里
die
d),它不会影响
perldebug
。是的,我知道,我假设您以某种方式覆盖了标准die或类似的东西。因此,如果我想在perl的堆栈跟踪('T'命令)调试器中查看参数,我需要:1。将您的代码附加到我想要执行调试2的代码中。还有什么要做的?