2010-03-02 10 views
7

Sto provando a correggere il mio codice per consentire a Perl di recuperare i dati non necessari indebolendo i riferimenti e i cicli di interruzione.Come posso tracciare riferimenti a oggetti Perl?

Recentemente ho fatto una domanda su How to access Perl ref counts e la risposta ha funzionato bene per me.

Per alcuni dei miei oggetti, il conteggio dei riferimenti è> 1 e non so perché.

C'è un modo per aggiungere un callback o qualcosa che possa aiutarmi a sapere quando viene incrementato un conteggio dei riferimenti? Voglio sapere chi fa riferimento a un oggetto.

+1

'weaken' non è implementato come" decrement il conteggio dei riferimenti ", i riferimenti deboli sono la loro stessa cosa. – jrockway

risposta

5

Implementare un pacchetto Devel::XXX che ispeziona i conti degli oggetti?

package Devel::Something; 
# just emulating Devel::Trace here 
# see http://cpansearch.perl.org/src/MJD/Devel-Trace-0.10/Trace.pm 
sub DB::DB { 
    if ($Devel::Something::CHECK) { 
     my ($package, $file, $linenumber) = caller; 
     ... inspect current refcounts 
     ... if any have changed, print out the details 
     ... including current package/file/linenumber 
     $Devel::Something::CHECK = 0; # disable until it's enabled again 
    } 
} 
1; 

# my program 
... do some stuff ... 
$Devel::Something::CHECK = 1; 
... do some more stuff ... 
$Devel::Something::CHECK = 1; 

$ perl -d:Something my_program.pl ... 

Si potrebbe cospargere $Devel::Something::CHECK = 1 affermazioni in luoghi appropriati in tutto il codice, o cambiare la condizione in DB::DB per eseguire ad intervalli regolari (ad esempio, if (++$Devel::Something::CHECK % 100 == 0) { per ispezionare dopo ogni 100 valutazioni dell'istruzione).

+0

+1 Questo è bello! – tsee

0

I valori di Perl tengono traccia solo dei loro riferimenti più deboli, non di quelli difficili. Sembra che non ci sia modo di aggiungere una richiamata per un simile pensiero. Dovrai controllare tu stesso i conti e fare i conti con quello.

Problemi correlati