_ATL_DEBUG_INTERFACES
Defina esta macro antes incluidos los archivos de encabezado ATL para traza todo el AddRef y llamadas de Liberar en las interfaces de los componentes en la ventana de salida.
#define _ATL_DEBUG_INTERFACES
Comentarios
El resultado de traza aparecerá como se muestra a continuación:
ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug
La primera parte de cada uno de traza siempre será ATL: QIThunk. El Siguiente es un valor que identifica el procesador concreto de la interfaz utilizado. Un procesador de interfaz es un objeto utilizado para mantener un recuento de referencia y proporcionar la capacidad de seguimiento utilizada aquí. Un nuevo procesador de interfaz se crea en cada llamada a QueryInterface excepto las solicitudes para la interfaz de IUnknown (en este caso, el mismo procesador se devuelve cada vez para cumplir las reglas de identidad de COM).
Siguiente verá AddRef o indicación de Liberar qué método se llamó. Siguiendo que, verá un valor la identificación del objeto cuyo recuento de referencia de la interfaz ha cambiado. El valor seguido paso a paso es el puntero de this del objeto.
El recuento de referencias se sigue paso a paso que es el recuento de referencias en dicho procesador después de que AddRef o Liberar se denomina. Observe que este número de referencias no puede coincidir con el recuento de referencias para el objeto. Cada procesador mantiene su propio número de referencias para ayudarle totalmente a cumplir las reglas del recuento de referencias COM.
La última parte de información de seguimiento es el nombre del objeto y de la interfaz que se ven afectados por AddRef o la llamada de Liberar .
Se denomina las pérdidas de interfaz se detecte que cuando el servidor se cierra y _Module.Term se registrará como ésta:
ATL: QIThunk - 2005 LEAK : Object = 0x00d81ca0 Refcount = 1 MaxRefCount = 1 CBug - IBug
La información proporcionada aquí se asigna directamente a la información proporcionada en las instrucciones de traza anteriores, por lo que puede examinar los recuentos de referencia en la duración completa de un procesador de interfaz. Además, se obtiene una indicación de recuento máximo de referencia en ese procesador de interfaz.
Nota |
---|
_ATL_DEBUG_INTERFACES se puede utilizar en las versiones de lanzamiento. |
Sugerencias
Puede ver cuando un nuevo procesador de interfaz crea buscando las llamadas de AddRef con Refcount de 1.
Puede ver cuando un procesador de interfaz es que se buscan las llamadas de Release con Refcount de 0.
Las instrucciones de traza se generan en un formato de valores separados por tabuladores por lo que es fácil cortar y pegar la información en una hoja de cálculo como Microsoft Excel para proporcionar filtrado avanzados, buscar y ordenar, funciones.
Si el código será similar a trabajar bien cuando _ATL_DEBUG_INTERFACES no está definido, pero origina infracciones de acceso cuando la macro es definido, tiene casi seguro un error recuento de correspondencia en el código de cliente, similar al que se muestra a continuación:
IBug* pBug = NULL; hr = p->QueryInterface(&pBug); ATLASSERT(SUCCEEDED(hr)); IBug* pBug2 = NULL; hr = p->QueryInterface(&pBug2); ATLASSERT(SUCCEEDED(hr)); pBug->Release(); pBug->Release(); // Mismatched - should be pBug2->Release();
Este código puede producirse para trabajar en algunas circunstancias comunes, pero es claramente con errores. Para que este código funcione, se basa en los detalles de implementación del objeto COM que proporciona la interfaz de IBug (IBug no se puede implementar como interfaz de rasgón) y es ubicación-dependiente (el cliente debe estar en el mismo apartamento que la implementación de IBug ). El uso de la macro de _ATL_DEBUG_INTERFACES puede llevar tales errores para encenderse.