我之前已成功使用Perl EPIC的调试器与Eclipse 3.7,但几个月前升级到Eclipse Kepler,从那时起直到今天都不需要调试任何Perl。今天EPIC用以下输出忽略了我的一些断点:
[Tue Sep 16 15:05:37 2014] perl5db.pl:640]: Use of uninitialized value $path in hash element at [...]/epic_breakpoints.pm line 73, <DATA> line 429.
[Tue Sep 16 15:05:37 2014] perl5db.pl:640]: Use of uninitialized value $path in pattern match (m//) at C:/Program Files/Perl/lib/Cwd.pm line 627, <DATA> line 429.
[Tue Sep 16 15:05:37 2014] perl5db.pl:640]: Use of uninitialized value in string ne at [...]/epic_breakpoints.pm line 94, <DATA> line 429.
请注意,这不是Windows中众所周知的Cwd.pm problem,但似乎添加断点本身不再适用。上述epic_breakpoints.pm中的相关代码如下:
8: use Cwd 'abs_path';
36: sub add_breakpoint
37: {
38: eval { _add_breakpoint(@_); };
39: # note/TODO: $@ ne '' here if the line was not breakable
40: }
69: sub _abs_path
70: {
71: my $path = shift;
72:
73: my $cached = $abs_path_cache{$path};
74: return $cached if $cached;
75:
76: eval { $cached = $abs_path_cache{$path} = abs_path($path); };
77: return defined($cached) ? $cached : $path;
78: }
79:
80: sub _add_breakpoint
81: {
82: my $source_path = _abs_path(_trim(shift));
[...]
问题似乎是$ path未定义,当然不应该这样。我激活了EPIC的调试器控制台并获得了以下输出:
Loading DB routines from perl5db.pl version 1.33
Editor support available.
Enter h or `h h' for help, or `perldoc perldebug' for more help.
Attribute::Handlers::CODE(0x29c75e8)(C:/Program Files/Perl/lib/Attribute/Handlers.pm:246):
246: $global_phase++;
DB<1> printf $DB::OUT "%vd", $^V;
5.14.4
DB<2> print $DB::OUT eval { require PadWalker; PadWalker->VERSION(0.08) }
1.96
DB<3> ;{
my $file = <<'EOT';
C:/Users/tschoening/Documents/Eclipse/Perl/Perl-Bibliotheken/stmodul/amsoft_warn_filter.pm
EOT
my $line = <<'EOT';
106
EOT
my $cond = '';
epic_breakpoints::add_breakpoint($file, $line, $cond);
};
显然,调试器似乎可以获得可用的路径,并且正在调用正确的函数,但不知怎的,它看起来像提供的args不再通过。 EPIC似乎总是从它的Eclipse包中提取epic_breakpoints.pm的不良行为,因此我似乎无法调试add_breakpoint以及提供了什么args(如果有的话)。
现在有趣的部分是我有一些非常简单的Perl测试文件,没有任何软件包等,只是一些Perl行,仍然可以成功调试,包括添加的断点。所以通常调试应该工作,这再次表明我没有Cwd.pm problem。
你对我在Perl软件包中出错的地方有什么想法吗?它似乎干扰了调试代码?我可以做些什么来处理eval等的一般args?我想要调试的应用程序有点大,我目前不知道要照顾什么,因此我很感激你可以为我应该照顾的任何提示。
谢谢!
答案 0 :(得分:0)
我已经测试了一点,奇怪的是行为改变了一点:我设法执行我想要调试的程序而没有发生错误,只是为了看到它在多次添加之后再次在调试会话中发生断点。不要误解我的意思:我已经成功地设法添加了一些断点,并且在添加了一些断点后,错误因某种原因而重新出现。看起来如果之前添加了断点,有时会从一开始就出现,如果不是,则取决于调试会话期间添加的断点数。
在对新添加的代码进行一些试验和错误之后,我看到以下两行介绍了问题:
require CGI::Carp;
CGI::Carp->import('fatalsToBrowser');
我可以重现只有在这两条线就位时才会发生错误。至少在开始时,一段时间后,即使有这些线,我也无法重现错误。另外,我正在使用匿名子参考注册一些 WARN 处理程序,其中我移动了args,我认为这可能会影响任何东西,但这看起来并不像因为它现在正在工作并且之前只使用上述牵引线进行了评论。
有时会发生奇怪的事情,因为它现在正在工作,我会忽略这个问题。 : - )