Бесконечный цикл в модуле Perl Carp
У нас есть код, который перехватывает исключение, регистрирует сообщение и затем вызывает Carp::longmess
чтобы получить трассировку стека.
Таким образом, упрощенное представление о том, что мы делаем:
eval { <some SOAP::Lite stuff> };
if( my $err = $@ )
{
logwrite( "Caught Error: $err" );
}
Функция logwrite по существу:
sub logwrite($)
{
my $msg = $_[0];
my($pkg,$fil,$lin)=caller;
my $timestamp = POSIX::strftime(...);
print STDERR "$timestamp $fil/$lin $msg\n";
print STDERR "$timestamp $fil/$lin Stack trace:\n" . Carp::longmess . "\n";
}
Но в журнале я вижу:
20111030 Module.pm/42 Caught Error: at line
Use of uninitialized value in caller at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 22.
Use of uninitialized value in string eq at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 91.
Use of uninitialized value in numeric lt (<) at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 200.
Use of uninitialized value in pattern match (m//) at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 55.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 55.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142.
...
И эта последовательность предупреждений от Carp/Heavy.pm
модуль повторяется снова и снова, неопределенно, выдувая логику. Таким образом, мы в конечном счете убиваем это. Эти предупреждения выглядят так, как будто они вызваны звонком Carp::longmess
, Другая интересная вещь здесь $@
переменная, кажется, просто at
, Это как at
добавлено die, но нет фактического сообщения об ошибке или номера строки.
Кто-нибудь видел это раньше или есть идеи, что происходит с Carp
пакет? Это редко, но случалось несколько раз за последний месяц или около того, и каждый день у нас работают сотни таких заданий.
2 ответа
Я понимаю, что это не отвечает на ваш актуальный вопрос, но.,, так как по-видимому $msg eq 'at line '
в этом случае, возможно, вам следует просто обойти проблему, unless $msg eq 'at line '
на конец print ... Carp::longmess ...
заявление? (Я имею в виду, если кто-то не предложит реальное решение.)
Ваш код работает для меня на Perl v5.10.1, с Carp.pm
версия 1.11.
Тем не менее, обратите внимание, что то, что он делает, возможно, не то, что вы ожидаете: обратный след, созданный longmess
покажет где logwrite
функция была вызвана, а не там, где внутри eval
,