2010-08-24 6 views
10

He ejecutado Devel::Leak en mi programa y no entiendo la salida que me está dando.¿Cómo interpreto la salida de Devel :: Leak

Para empezar, veo que está imprimiendo una lista de punteros. ¿Puedo obtener esa lista en una matriz? Luego puedo usar FindRef para ver de dónde viene.

Por ejemplo:

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 montón de entradas más pequeños:

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

¿Qué hago con esto? Obtengo las cosas de la estructura Perl (magic, iv, pv, ..), pero ¿cómo puedo ir desde estas líneas hasta saber dónde está ocurriendo mi fuga?

+1

http://blog.woobling.org/2009/05/become-hero-plumber.html; ver también 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-herehere-any-tools-for-finding -memory-leaks-in-my-perl-program – Ether

+0

@Ether Gracias por el enlace. En general, estoy buscando identificar qué es lo que estos objetos filtrados son más que el motivo por el que no se están recolectando. – mmccoo

Respuesta

1

Eche un vistazo a Devel::LeakTrace para un módulo que también registra dónde se ha asignado la memoria.

+0

lamentablemente, Devel :: LeakTrace necesita GLib 1.2 (la última es 2.4) y no se ha actualizado desde 2003. Sin embargo, parece interesante. –

+0

así que conseguí que Devel :: LeakTrace construyera usando Build.PL aquí: https://rt.cpan.org/Public/Bug/Display.html?id=59027 pero me dice que 'perl -MDevel :: LeakTrace -e '{mi $ f = [1,2,3]; undef $ f '} '¡filtra 4 SVs! Eso no puede ser correcto ¿verdad? –

+0

@philip, también mira http://search.cpan.org/~gfuji/Test-LeakTrace-0.13/, es más reciente. – vladr