Come posso sapere se il mio codice gestito perde memoria a causa delle chiamate alla libreria nativa?

StackOverflow https://stackoverflow.com/questions/244489

Domanda

Ho una DLL gestita che chiama in una libreria nativa. Questa libreria nativa generalmente restituisce IntPtrs. Questi possono essere passati ad altri metodi nella libreria nativa per fare cose o per dire alla libreria di liberare l'istanza associata a IntPtr. Ma solo alcune delle istanze devono essere liberate in questo modo, altre sono gestite dalla libreria. Il problema è che la documentazione non è sempre chiara su quali istanze debbano essere liberate e quali no.

Quello che voglio sapere è se c'è un modo in cui posso dire se il mio codice ha mantenuto i riferimenti a uno dei puntatori che devono essere liberati, e quindi sta causando una perdita di memoria?

È stato utile?

Soluzione

Il modo più semplice è probabilmente usare un profiler di memoria. Un rapido google ha rivelato un collegamento a MemProfiler . L'ho usato una volta (come prova) e sono stato in grado di trovare luoghi in cui non stavo smaltendo correttamente DirectoryEntries. Sono sicuro che ce ne sono altri, incluso questo uno di RedGate.

Altri suggerimenti

Uso WinDbg (è disponibile qui ). È guidato dalla riga di comando ma fornisce molti buoni report che includono informazioni sullo stack, numero di oggetti e dimensioni prese (questo può aiutare a indicare gli articoli che non vengono eliminati).

Esiste anche lo strumento di diagnostica di debug che presenta report specifici per perdite di memoria e gestione. È qui

Potresti prendere in considerazione l'utilizzo di SafeHandles per avvolgere le maniglie restituite dal codice nativo. Fornisce un valore aggiuntivo rispetto a IntPtr.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top