Thread Vorgehensweise bei der Fehlersuche (Objekt wird zu früh zerstört)
(7 answers)
Opened by xtomcatx at 2008-09-10 18:41
Spät in der Nacht bin ich gestern auf die Ursache des Problems gestoßen. Zuerst habe ich mir den Adapter für die Model-Schnittstelle gebaut. Hier war auch einiges grübeln angesagt, bis es endgültig dann doch recht einfach ging:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 use Apache::Session::MySQL; sub TIEHASH { my $class = shift; my $session_id = shift; my $param = shift; my $self = {}; $self->{ASM} = Apache::Session::MySQL->TIEHASH( $session_id, { Handle => $param->{model}->{dbi}, LockHandle => $param->{model}->{dbi}, TableName => $param->{model}->{cfg}->{db}->param( "sessions" ) } ); $param->{model}->{session} = $self; bless( $self, $class ); return $self; } sub AUTOLOAD { my $self = shift; our $AUTOLOAD =~ s/.*:://; $self->{ASM}->$AUTOLOAD( @_ ); } Vererbung funktioniert bei diesem Problem meiner Meinung nach nicht, wenn man nicht doch wieder alles an ASM abgeben will. Als ich fertig war, war das Hauptproblem jedoch immer noch das selbe: DBI-Objekt wird zu früh zerstört, bzw. das Session-Objekt zu spät. Auch über einen zusätzlichen Destruktor für Model, der das registrierte Session zerstören sollte, hat es nicht funkitioniert. Allerdings war das Fehlerverhalten jetzt eindeutig reproduzierbar und nicht mehr so Dingen wie CGI::Carp abhängig, also konnte ich auf Fehlersuche gehen. Lange Rede, kurzer Sinn: Der Fehler lag tatsächlich bei mir, allerdings kann ich ihn noch nicht so ganz nachziehen. Der relevante Code-Teil im Hauptprogramm: Code (perl): (dl
)
1 2 3 4 5 6 7 8 my $session = Session->new( { cgi => $cgi, model => $model } ); $session->create; [...] sub niegenutztesub { $session->header; tuetwas(); exit; } Das Problem war nun, dass der lexikalische Gültigkeitsbereich von $session von mir ausgenutzt wurde. Ganz verstehen tu ichs nicht, weil die sub ja nirgends aufgerufen wird. Ich vermute, dass der Compiler sich nicht sicher war, ob die sub vielleicht doch noch irgendwo aufgerufen wird und die Session-Instanz deshalb nicht zum normalen Zeitpunkt, sondern erst ganz am Schluss zerstört hat. Wieso nicht trotzdem das DBI-Objekt später zerstört wird, wo doch noch eine Referenz vorhanden ist, bleibt mir ein Rätsel. Kurz gezögt habe ich, als ich auf die Übergabe von $session über einen Parameter verzichtet habe, aber habs dann doch so gemacht. Jedenfalls hat mich das jetzt gut einen Tag gekostet... |