2010-08-24 10 views
10

ho eseguito Devel::Leak nel mio programma e non capisco l'uscita mi sta dando.Come si interpretano l'uscita di Devel :: Leak

Per iniziare, vedo che sta stampando una lista di puntatori. Posso ottenere quell'elenco in una matrice? Quindi posso usare FindRef per vedere da dove proviene.

Ad esempio:

new 0xaebc28 : SV = PVGV(0x30e7e48) at 0xaebc28 
    REFCNT = 1 
    FLAGS = (GMG,SMG) 
    IV = 0 
    NV = 0 
    PV = 0 
    MAGIC = 0x2db7dc0 
    MG_VIRTUAL = &PL_vtbl_glob 
    MG_TYPE = PERL_MAGIC_glob(*) 
    MG_OBJ = 0xaebc28 
    NAME = "SUPER::" 
    NAMELEN = 7 
    GvSTASH = 0x76b228 "IO::File" 
    GP = 0x314b170 
    SV = 0x30283c8 
    REFCNT = 1 
    IO = 0x0 
    FORM = 0x0 
    AV = 0x0 
    HV = 0x301fdb8 
    CV = 0x0 
    CVGEN = 0x0 
    GPFLAGS = 0x0 
    LINE = 161 
    FILE = "/mypath/perl_install/perl/lib/5.8.9/x86_64-linux/IO/File.pm" 
    FLAGS = 0x0 
    EGV = 0xaebc28  "SUPER::" 

o un gruppo di voci più piccoli:

new 0x161c268 : SV = RV(0x3029b40) at 0x161c268 
    REFCNT = 1 
    FLAGS = (ROK) 
    RV = 0x161c218 

Cosa devo fare con questo? Ottengo il materiale struct Perl (magic, iv, pv, ..), ma come faccio a passare da queste righe a sapere dove si sta verificando la mia perdita?

+1

http://blog.woobling.org/2009/05/become-hero-plumber.html; vedi anche http://stackoverflow.com/questions/1359771/perl-memory-usage-profiling-and-leak-detection, http://stackoverflow.com/questions/2223721/common-perl-memory-reference-leak -patterns, http://stackoverflow.com/questions/1663498/finding-a-perl-memory-leak, http://stackoverflow.com/questions/295385/are-there-any-tools-for-finding -memory-leaks-in-my-perl-program – Ether

+0

@Ether Grazie per il collegamento. Principalmente sto cercando di identificare quali sono questi oggetti trapelati più del perché non vengono raccolti. – mmccoo

risposta

1

Date un'occhiata a Devel::LeakTrace per un modulo che ha anche i record in cui è stata allocata la memoria.

+0

purtroppo, Devel :: LeakTrace ha bisogno di GLib 1.2 (l'ultimo è 2.4) e non è stato aggiornato dal 2003. Sembra interessante però. –

+0

quindi ho creato Devel :: LeakTrace per costruire usando Build.PL qui: https://rt.cpan.org/Public/Bug/Display.html?id=59027 ma mi sta dicendo che 'perl -MDevel :: LeakTrace -e '{my $ f = [1,2,3]; undef $ f '} 'perde 4 SV! Non può essere giusto, vero? –

+0

@philip, controlla anche http://search.cpan.org/~gfuji/Test-LeakTrace-0.13/, è più recente. – vladr