デバッガーの外部で正常に実行されるPerlコードがいくつかあります。
% perl somefile.pl
しかし、デバッガー内で実行すると、次のようになります。
% perl -d somefile.pl
動作が異なります。
問題のファイル(いくつかあります)は、大規模なPerlモジュール(約2万行のコード)のテストスイートの一部です。テストはコンパイル時に多くのセットアップ作業を行い、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 OSX10.5.5でperl5.10.0を使用しています。
Adam Bellaireによって提案されたdieLevelのことは有望に見えました、そして確かに何か(何を見つけることができないか)が私にとってそれを1に設定しています。しかし、~/.perldb
ファイルを使用して0に設定すると、問題が解決しません。実際、関連する3つの設定すべてを0に設定しました。私の~/.perldb
ファイル:
parse_options('dieLevel=0 warnLevel=0 signalLevel=0');
o
デバッガーでコマンドを実行して、設定が有効になっていることを確認しました。perl -de 0
実行時と実際のファイルの実行時に、すべて0に設定されているのがわかりsomefile.pl
ます。
ありがとう、ブライアン。以前perlbug
はバグ(RT 60890local $SIG{'__DIE__'}
)を報告していましたが、コード内の適切な場所すべてに散らばり始めました。(バグの中で、デフォルトが0perldoc perldebug
であることを示唆しているようにも見えます。 )dieLevel