2009-11-17 12 views
5

Tengo una fuga de controlador en un gran programa anterior. Usando sysinternals handle.exe deduje que el tipo de identificador que se está filtrando es un identificador de "Evento". Pero no estoy seguro de qué partes de mi código debería ver. ¿Hay alguna lista en alguna parte de las funciones que devuelven identificadores a los eventos?¿Qué es un controlador de evento?

EDITAR: No hay una sola instancia de CreateEvent, CreateEventEx u OpenEvent en todo el programa.

Respuesta

2

¿Cuántas manijas filtradas ven?

Los eventos se crean implícitamente por secciones críticas (consulte InitializeCriticalSection et.al.) y, probablemente, algunos otros elementos de Win32 que no puedo recordar en este momento. Además, pueden ser creados por el marco que está utilizando (si lo hay) como MFC o por las bibliotecas que está utilizando.

Para rastrear la fuga, puede utilizar un punto de interrupción de solo impresión. Entre en la función CreateEvent (usando la vista de conjunto) y ponga un punto de interrupción en su primera instrucción. A continuación, haga clic con el botón derecho en el punto de interrupción, elija "Cuando aparezca ..." y edite las opciones para que no entren en el depurador, pero imprimirán información útil (por ejemplo, consulte la macro $ CALLER). Luego ejecute su aplicación ... y prepárese para ver un registro ENORME. Si hay una fuga verdadera, verá un patrón repetitivo en el registro, que identifica al delincuente.

+0

Después de la ráfaga inicial, el programa se establece para crear aproximadamente uno o dos por segundo. - Esta respuesta suena muy factible, pero no puedo intentarlo hasta mañana. Aclamaciones. – Mick

0

Hasta donde yo sé, casi las únicas cosas que crean un evento son CreateEvent y CreateEventEx. Otras pocas funciones pueden devolver un identificador a un evento (por ejemplo, WaitForMultipleObjects) pero es un identificador que usted creó previamente y le pasó a él.

Editar: Dado que su código aparentemente no está creando el evento directamente, es posible que desea comenzar utilizando desvíos para ver las llamadas a CreateEvent (Ex), y rastrear la pila para ver qué parte de su código está causando que se creen, y qué está llamando que las está creando.

1

Como han mencionado otras personas, CreateEvent/CreateEventEx se utilizan para crear identificadores de "Evento". Representan objetos de sincronización que se utilizan con frecuencia para acceder a la puerta de enlace, proporcionar señales (potencialmente) a otros hilos y también se pueden usar como base para bloqueos.

Si está intentando depurar una pérdida que implica identificadores de eventos, debe intentar buscar los lugares donde se llama a CreateEvent (Ex) sin un CloseHandle() correspondiente. Dependiendo de los marcos que usó para obtener Eventos, también puede encontrar que puede que falte en la limpieza si son miembros de otro objeto/estructura (Ej. Algo que tiene una variable de miembro HANDLE genérica que se omite en la limpieza, o un puntero a una MANIJA, etc.).

Si no recuerda haber creado estos objetos en su propio código, es posible que le falte un Close() análogo u otro método de limpieza en otra clase o proveedor que los use internamente. Las cosas que procesan el fondo, señalan o proporcionan métodos para esperar que finalicen las operaciones son los sospechosos habituales aquí. Maneja

Crear evento
CreateEvent Function @ MSDN
CreateEventEx Function @ MSDN

limpieza de las manijas
CloseHandle Function @ MSDN

1

Si no sabe qué archivos DLL o componentes de terceros están llamando CreateEvent o CreateEventEx continuación, utilizar el Dependency Walker para ver lo que importa cada DLL:

http://www.dependencywalker.com/ (es gratis)

Eso al menos ayudará a reducir el problema a un conjunto particular de interacciones, entonces tendrá que mirar todas las llamadas a esa biblioteca y verificar que todo se haya limpiado correctamente.

1

Incluso si no crea Eventos usted mismo directamente, el sistema operativo u otro código de biblioteca ciertamente puede y lo hará. Es posible que desee ver la posibilidad de que haya algún otro recurso que su aplicación esté abriendo o creando y que no esté siendo limpiado.Es posible que realmente esté filtrando algo más, pero eso está trayendo un objeto de evento para el viaje.

Podría ayudar establecer un punto de interrupción de depuración en CreateEvent (y amigos), para ver qué es lo que lo crea, pero no me sorprendería que ocurra lo suficiente para que su problema se pierda en el ruido.

Cuestiones relacionadas