[Moscow.pm] Помогите найти багу

Сергей Мартынов sergey на martynov.info
Чт Дек 20 12:09:28 PST 2007


> Под mod_perl-ом в лог ошибок Апача падают иногда вот такие ошибки:
>
> DESTROY created new reference to dead object 'BlogLibs::User::Guest' during global destruction.
>
> Поиски  этой  ошибки  пока  безрезультатны.  Совершенно не ясно как её
> локализовать, и когда она происходит.

Происходит она, очевидно, during global destruction :) Я с таким не
сталкивался, поэтому погуглил... Сама ошибка описана в perdiag:

DESTROY created new reference to dead object '%s'

    (F) A DESTROY() method created a new reference to the object which
is just being DESTROYed. Perl is confused, and prefers to abort rather
than to create a dangling reference.

Минимальный код, иллюстрирующий ошибку:
perl -e 'use strict; sub DESTROY {$a=shift}; bless[];'

Т.е. ситуация такова, что в DESTROY создается новая ссылка на объект,
применительно к которому DESTROY вызван. Как правильно заметил Макс,
это легко можно допустить при использовании AUTOLOAD:

% perl -e 'sub AUTOLOAD {warn $AUTOLOAD;$a=shift}; $b=bless[];'
main::DESTROY at -e line 1 during global destruction.
DESTROY created new reference to dead object 'main' during global destruction.


Наиболее адекватная заметка про это в инете -
http://grokbase.com/post/2003/12/08/perl-24627-destroy-message-not-in-perldiag-pod/iQ9IlS68tEPtbsm0vVKtNSPmJxY

-- 
С уважением, Сергей Мартынов.


Подробная информация о списке рассылки Moscow-pm