Perl 具有可读子例程参数的堆栈跟踪
是否可以使用函数参数打印“精细”stacktrace 插值的,如Data::Dumper是什么? 而不是这最后一行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........
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的代码中。还有什么要做的?