2011-10-21 22 views
8

Esta es una pregunta de seguimiento a my previous question.¿Qué puede causar fugas en la manija de la sección?

Como se sugiere en this answer to my previous question, solía ProcessExplorer para analizar una lista de identificadores que mi solicitud está utilizando para encontrar una pérdida de identificadores.

Los mangos que tienen fugas son del tipo Sección.

¿Qué es exactamente un identificador de sección, dónde se usa y qué puede causar fugas en las asas de sección?

No estoy usando archivos asignados de memoria en mi código.

+0

Usted no está utilizando archivos asignados de memoria, ¿es otra persona? ¿Qué componentes estás usando? Dll de cualquier tercero? – Harriv

Respuesta

4

Citando de Mark Russinovich Inside Windows 2000 (lo que ahora se llama Windows Internals),

El objeto de sección, que el subsistema Win32 llama a un mapeo objeto archivo, representa un bloque de memoria que dos o más procesos pueden compartir.

Por lo tanto, es un archivo de memoria asignada. Perderían si creaste un archivo mapeado en memoria y no lo cerraste. Es bastante difícil ser mucho más específico.

+1

Gracias. La mala noticia es que no estoy usando archivos mapeados en memoria :( – jpfollenius

2

Un archivo mapeado de memoria no asociado con un identificador de archivo se puede utilizar para IPC (comunicación entre procesos). Si no los usa directamente, quizás uno de su unidad o componente esté haciendo alguna comunicación IPC. Es muy probable que use un componente para conectarse a otro proceso y no lo libere según lo solicitado.

La primera medida que debe tomarse es rastrear cualquier pérdida de memoria (utilizando el modo de depuración FastMM4), y seguramente encontrará algunos objetos no liberados en su código.

Dado que los objetos comunes se asignan normalmente a los objetos, desde mi experimento, la resolución de todas las pérdidas de memoria resolverá las fugas del controlador.

Si no tiene ninguna pérdida de memoria, hay algunas llamadas a CreateFileMapping() para verificar el correspondiente CloseHandle() en todo su código fuente (incluida la fuente de un tercero).

3

Resulta que el problema estaba en una función de bajo nivel que cuenta el número de subprocesos del proceso actual. Esta función usó la función

CreateToolhelp32Snapshot 

API que devuelve un identificador, que no se cerró correctamente. No estoy seguro de por qué esto produce una fuga de mango de sección.

+0

Correcto, pero es una explicación bastante inesperada para las filtraciones de identificador de sección, por lo que responde al menos parte de la pregunta. – jpfollenius

1

La fuga de identificador de sección en .net se debe a la revisión de Microsoft KB2670838. Desinstale esta actualización y se solucionará el problema de fuga del controlador de sección (Sin memoria).

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