2011-10-21 22 views
8

Questa è una domanda di follow-up a my previous question.Cosa può causare perdite nella sezione?

Come suggerito in this answer to my previous question, ho usato ProcessExplorer per analizzare un elenco di maniglie che la mia domanda sta usando per trovare una perdita di handle.

Le maniglie che perdono sono di tipo sezione.

Che cosa è esattamente una maniglia di sezione, dove viene utilizzata e cosa può causare perdite nelle maniglie della sezione?

Non sto utilizzando file mappati in memoria nel mio codice.

+0

Non si stanno utilizzando file mappati in memoria, è qualcun altro? Quali componenti stai usando? Qualsiasi dll di terze parti? – Harriv

risposta

4

Citando Mark Russinovich All'interno di Windows 2000 (quello che viene ora chiamato Windows Internals),

L'oggetto sezione, che il sottosistema di Win32 chiama una mappatura oggetto file di, rappresenta un blocco di memoria che due o più processi possono condividere.

Quindi, è un file mappato in memoria. Perderebbero se si fosse creato un file mappato in memoria e non fosse riuscito a chiuderlo. Difficile essere molto più specifici.

+1

Grazie. La cattiva notizia è: non sto usando affatto file di memoria mappata :( – jpfollenius

2

Un file mappato in memoria non associato a un handle di file può essere utilizzato per IPC (comunicazione tra processo). Se non li usi direttamente, forse una delle tue unità o componenti sta facendo alcune comunicazioni IPC. È molto probabile che tu usi un componente per connetterti a un altro processo e non lo rilasci come richiesto.

La prima azione da intraprendere è la traccia per eventuali perdite di memoria (utilizzando la modalità di debug di FastMM4) e nel codice verranno sicuramente trovati alcuni oggetti non rilasciati.

Poiché le maniglie sono comunemente assegnate da oggetti, dal mio esperimento, la risoluzione di tutte le perdite di memoria risolverà le perdite di handle.

Se non si dispone di alcuna perdita di memoria, v'è una certa CreateFileMapping() chiamate a verificare la presenza di un corrispondente CloseHandle() in tutto il codice sorgente (tra cui l'origine di terze parti).

3

Si scopre che il problema era in una funzione di basso livello che conta il numero di thread del processo corrente. Questa funzione utilizza la funzione API

CreateToolhelp32Snapshot 

che restituisce una maniglia, che non è stato chiuso correttamente. Non sono sicuro del perché questo produce una perdita di handle di sezione però.

+0

Giusto, ma è una spiegazione piuttosto inaspettata per la sezione gestire le perdite, quindi risponde almeno parte della domanda. – jpfollenius

1

La perdita di handle di sezione in .net è dovuta all'aggiornamento rapido Microsoft KB2670838. Disinstallare questo aggiornamento e verrà risolto il problema di perdita di gestione della sezione (Memoria insufficiente).

Parameter is not valid. at System.Drawing.Image.get_Width() 
at System.Drawing.Image.get_Size()