我有一些在调试器之外运行良好的 Perl 代码:
% perl somefile.pl
但是当我在调试器中运行它时:
% perl -d somefile.pl
它的行为不同。
有问题的文件(有几个)是大型 Perl 模块(约 20K 行代码)的测试套件的一部分。测试在编译时做了很多设置工作并使用 BEGIN 块。这是一些最小的复制代码:
BEGIN
{
package MyEx;
sub new { bless {}, shift }
package main;
eval { die MyEx->new };
if($@)
{
die "Really die" unless($@->isa('MyEx'));
}
}
print "OK\n";
如果你把它放进去somefile.pl
并运行它,它会按预期打印“OK”。如果您在调试器中使用 运行它perl -d somefile.pl
,它会因以下错误而死:
Can't call method "isa" without a package or object reference ...
结果是$@
当代码在调试器下运行时它不是对象。相反,它是一个包含此字符串的无福标量:
" at somefile.pl line 9
eval {...} called at somefile.pl line 9
main::BEGIN() called at somefile.pl line 16
eval {...} called at somefile.pl line 16
"
(保留内部换行符和间距。这是文字,甚至是“...”。)
我需要这样的代码才能在调试器中运行。在测试套件中使用调试器是我工作流程的重要组成部分。该模块使用异常对象并在编译时做了很多事情,并期望抛出的对象在被捕获时成为对象。
我的问题(最后)是这样的:我怎样才能让它工作?有解决方法吗?这是 perl 调试器模块中的错误吗?解决此问题的最佳方法是什么?(我知道这是几个问题,但它们都是相关的。)
我在 Mac OS X 10.5.5 上使用 perl 5.10.0。
Adam Bellaire 建议的 dieLevel 看起来很有希望,而且确实有些东西(无法找出是什么)对我来说将它设置为 1。但是我使用~/.perldb
文件将其设置为 0 并且问题仍然存在。事实上,我将所有三个相关设置都设置为 0。我的~/.perldb
文件:
parse_options('dieLevel=0 warnLevel=0 signalLevel=0');
o
我通过在调试器中运行命令确认设置生效。当我运行perl -de 0
时以及运行实际somefile.pl
文件时,我看到它们都设置为 0。
谢谢,布赖恩。我曾经perlbug
提交过一个错误 ( RT 60890 ),并且我已经开始local $SIG{'__DIE__'}
在我的代码中的所有适当位置进行添加。(我还在错误中注意到perldoc perldebug
似乎仍然暗示默认dieLevel
值为 0。)