2015-08-15 15 views
7

Quindi, è un po 'un caso semplice - ma se ho creato un riferimento circolare come questo:Trovare variabili 'Lost' (riferimenti circolari)

#!/usr/bin/perl 
use strict; 
use warnings; 

{ 
    my $thing; 
    my $otherthing; 
    $thing -> {otherthing} = \$otherthing; 
    $otherthing -> {thing} = \$thing; 
} 

creo una perdita di memoria - perché con il conteggio di riferimento , la memoria allocata qui non sarà mai liberata, nonostante non abbia alcun "punto di accesso" verso l'esterno.

Quindi, quello che mi chiedo - in questo tipo di scenario, c'è un modo in cui potrei, tramite il debug o simili, "riscoprire" queste variabili e ottenere di nuovo accesso ad esse?

Ipoteticamente sto pensando in un caso meno banale - hai un oggetto trapelato memoria, ma vorrebbe 'riprenderlo' di nuovo per vedere cosa c'è dentro, per dare un suggerimento su cosa c'era in detto oggetto e quindi dove stava iniziando il problema.

+0

So che http://search.cpan.org/~lds/Devel-Cycle-1.10/lib/Devel/Cycle.pm e http://search.cpan.org/~ilyaz/Devel- Peek-0.96/Peek.pm aiutano entrambi con questi problemi, ma non li ho mai usati quando i varsono fuori portata e si "perdono", quindi non so se sono utili in questi casi. Vale la pena guardare – stevieb

+0

Forse [Devel :: LeakTrace :: Fast] (https://metacpan.org/pod/Devel::LeakTrace:: Fast)? – ThisSuitIsBlackNot

+0

https://metacpan.org/pod/Devel::Gladiator, https://metacpan.org/pod/Devel::MAT::Dumper, 'pmat-explore-gtk' – melpomene

risposta

5

Questa è solo una descrizione dei moduli consigliati nei commenti sulla domanda. Esso include un link alla documentazione POD di ciascun modulo, e cita i nome e descrizione sezioni. È pensato per essere accessibile. Da nessuna parte ho aggiunto o modificato ciò che l'autore ha scritto o estratto informazioni da qualsiasi parte diversa dalle sezioni nome e descrizione

Chiunque è il benvenuto ad aggiornarlo con moduli aggiuntivi purché mantengano questo formato. In alternativa, chiunque può richiamare la mia attenzione sul fatto che è necessario aggiornarlo e lo farò quando posso

Molti grandi programmatori non sono così bravi con l'inglese così, mentre ho provato a citare esattamente la documentazione, ho tagliato quello che ritengo essere le sezioni meno rilevanti in linea con lo scopo di questo post

Devel::Cycle - Trova cicli di memoria negli oggetti

questo è uno strumento semplice dello sviluppatore per la ricerca di riferimenti circolari a oggetti e altri tipi di riferimenti. A causa della gestione della memoria basata sul numero di riferimento di Perl, i riferimenti circolari causeranno perdite di memoria.

Devel::LeakTrace::Fast - Indicare in cui le variabili trapelate sono provenienti da.

Devel::LeakTrace::Fast è una riscrittura di Devel::LeakTrace. Come Devel::LeakTrace utilizza la funzione innestabile runops trovata in perl 5.6 e successive per tracciare le allocazioni SV di un programma in esecuzione.

Al END tempo Devel::LeakTrace::Fast identifica eventuali variabili rimanenti e riporta le righe in cui è stato creato.

Devel::Gladiator - Cabine arena di Perl

Devel::Gladiator itera strutture di memoria interna di Perl e può essere utilizzato per enumerare tutte le vivono attualmente SV.

Questo può essere utilizzato per cercare perdite e per l'utilizzo della memoria del profilo.

Devel::MAT::Dumper - Scrivere un file heap dump per l'analisi successiva

Questo modulo fornisce la funzione di memoria antidumping che crea un file heap dump che possono poi essere letti da Devel::MAT::Dumpfile. Fornisce una singola funzione che non viene esportata, che scrive un file nel percorso specificato.

Il file di dump conterrà una rappresentazione di ogni SV nell'arena di Perl, fornendo informazioni sui puntatori tra di loro, nonché altre informazioni sullo stato del processo al momento della creazione. Contiene un'istantanea del processo in quel momento, che può essere successivamente caricato e analizzato con vari strumenti usando Devel::MAT::Dumpfile.

Devel::Peek - uno strumento di debug dei dati per il programmatore XS

Devel::Peek contiene funzioni che permettono tipi di dati Perl prime a essere manipolati da uno script Perl. Questo è usato da coloro che fanno programmazione XS per verificare che i dati che stanno inviando da C a Perl guardino come pensano che dovrebbe apparire.

Problemi correlati