以前は Eclipse 3.7 で Perl EPIC のデバッガーを正常に使用していましたが、数か月前に 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の問題ではないことに注意してください。代わりに、ブレークポイントを追加すること自体が機能しなくなっているようです。上記の 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);
};
明らかに、デバッガーは使用可能なパスを取得しているようで、適切な関数を呼び出していますが、どういうわけか、提供された引数が通過していないように見えます。EPIC は、常に Eclipse バンドルから epic_breakpoints.pm を抽出するという悪い動作をしているようです。
ここで興味深いのは、私が持っているいくつかの非常に単純な Perl テスト ファイルは、パッケージなどを使用せずに、いくつかの Perl 行を追加しただけで、追加のブレーク ポイントを含めて正常にデバッグできることです。したがって、一般的にデバッグは機能するはずであり、これもまた、私がCwd.pm の問題に悩まされていないことを示しています。
私のPerlパッケージで、デバッグコードを何らかの形で妨害しているように見える私が間違っている可能性があることについて何か考えがありますか? eval などの一般的な引数の処理に対して何かできたことはありますか? デバッグしたいアプリはやや大きく、現在何をすべきかわかりません。そのため、私が何をすべきかについてのヒントを提供していただければ幸いです。
ありがとう!