У меня есть некоторый Perl-код, который отлично работает вне отладчика:
% perl somefile.pl
но когда я запускаю его внутри отладчика:
% perl -d somefile.pl
ведет себя по-разному.
Указанные файлы (их несколько) являются частью набора тестов для большого модуля Perl (~ 20 тыс. Строк кода). Тесты выполняют большую часть настройки во время компиляции и используют блоки 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? Каков наилучший способ решить эту проблему? (Я знаю, что это несколько вопросов, но все они связаны.)
Я использую Perl 5.10.0 в Mac OS X 10.5.5.
вещь dieLevel, предложенная Адамом Беллэром, выглядела многообещающе, и действительно что-то (не могу выяснить, что) устанавливает для меня 1. Но я установил его на 0, используя файл ~/.perldb
, и проблема остается. Фактически, я установил все три связанных параметра в 0. Мой ~/.perldb
файл:
parse_options('dieLevel=0 warnLevel=0 signalLevel=0');
Я подтвердил, что настройки действуют, выполнив команду o
в отладчике. Я вижу, что все они установлены в 0, когда я запускаю perl -de 0
, а также при запуске самого файла somefile.pl
.
Спасибо, Брайан. Я использовал perlbug
, чтобы сообщить об ошибке ( RT 60890 ), и я начал разбрасывать local $SIG{'__DIE__'}
во всех соответствующих местах в моем коде. (Я также отметил в ошибке, что perldoc perldebug
все еще подразумевает, что по умолчанию dieLevel
равно 0.)