2010-08-24 6 views
10

J'ai exécuté Devel::Leak dans mon programme et je ne comprends pas la sortie qu'il me donne. Pour commencer, je vois qu'il imprime une liste de pointeurs. Puis-je obtenir cette liste dans un tableau? Ensuite, je peux utiliser FindRef pour voir d'où ça vient.Comment interpréter la sortie de Devel :: Leak

Par exemple:

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::" 

ou un tas de petites entrées:

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

Que dois-je faire avec ça? J'obtiens les trucs de structure Perl (magie, iv, pv, ..), mais comment puis-je passer de ces lignes à savoir où ma fuite se produit?

+1

http://blog.woobling.org/2009/05/become-hero-plumber.html; voir aussi http://stackoverflow.com/questions/1359771/perl-memory-usage-profil-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-programme – Ether

+0

@Ether Merci pour le lien. La plupart du temps, je cherche à identifier ce que sont ces objets qui fuient plus que pourquoi ils ne sont pas collectés. – mmccoo

Répondre

1

Jetez un oeil à Devel::LeakTrace pour un module qui enregistre également où la mémoire a été allouée.

+0

malheureusement, Devel :: LeakTrace a besoin de GLib 1.2 (le plus récent est 2.4) et n'a pas été mis à jour depuis 2003. Cela semble intéressant cependant. –

+0

alors j'ai obtenu Devel :: LeakTrace pour construire en utilisant Build.PL ici: https://rt.cpan.org/Public/Bug/Display.html?id=59027 mais ça me dit que 'perl -MDevel :: LeakTrace -e '{my $ f = [1,2,3]; undef $ f '} 'fuit 4 SVs! Cela ne peut pas être vrai, n'est-ce pas? –

+0

@philip, consultez aussi http://search.cpan.org/~gfuji/Test-LeakTrace-0.13/, c'est plus récent. – vladr