Macros de depuración e informe de errores
Estas macros proporcionan funciones útiles de depuración y seguimiento.
Nombre | Descripción |
---|---|
_ATL_DEBUG_INTERFACES | Escribe, en la ventana de salida, las pérdidas de interfaz que se detectan cuando se llama a _Module.Term . |
_ATL_DEBUG_QI | Escribe todas las llamadas en QueryInterface a la ventana de salida. |
ATLASSERT | Realiza la misma funcionalidad que la macro _ASSERTE que se puede encontrar en la biblioteca en tiempo de ejecución de C. |
ATLENSURE | Realiza la validación de parámetros. Llame a AtlThrow si es necesario |
ATLTRACENOTIMPL | Envía un mensaje al dispositivo de volcado de memoria de que la función especificada no está implementada. |
ATLTRACE | Notifica advertencias a un dispositivo de salida, como la ventana del depurador, según las marcas y los niveles indicados. La compatibilidad con versiones anteriores está incluida. |
ATLTRACE2 | Notifica advertencias a un dispositivo de salida, como la ventana del depurador, según las marcas y los niveles indicados. |
_ATL_DEBUG_INTERFACES
Defina esta macro antes de incluir cualquier archivo de encabezado ATL para hacer el seguimiento de todas las llamadas AddRef
y Release
en las interfaces de los componentes a la ventana de salida.
#define _ATL_DEBUG_INTERFACES
Comentarios
La salida de seguimiento aparecerá como se muestra a continuación:
ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug
La primera parte de cada seguimiento siempre será ATL: QIThunk
. A continuación, hay un valor que identifica la interfaz en código thunk específica que se está usando. Una interfaz en código thunk es un objeto que se usa para mantener un recuento de referencias y ofrecer la capacidad de seguimiento usada aquí. Se crea una nueva interfaz en código thunk en cada llamada QueryInterface
excepto para las solicitudes de la interfaz IUnknown
(en este caso, se devuelve el mismo código thunk cada vez para cumplir con las reglas de identidad de COM).
A continuación, verá AddRef
o Release
que indica qué método se ha llamado. Después, verá un valor que identifica el objeto al que se le ha cambiado la cuenta de referencias de la interfaz. El valor de seguimiento es el puntero del objeto this
.
El recuento de referencias que se realiza en un seguimiento es el recuento de referencias de ese código thunk después de que se llamara a AddRef
o Release
. Tenga en cuenta que este recuento de referencias puede no coincidir con el del objeto. Cada código thunk mantiene su propio recuento de referencias para ayudarle a cumplir plenamente con las reglas de recuento de referencias de COM.
El último fragmento de información rastreado es el nombre del objeto y la interfaz afectada por la llamada AddRef
o Release
.
Las pérdidas de interfaz que se detectan cuando el servidor se apaga y se llama a _Module.Term
se registrarán así:
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 seguimiento anteriores, por lo que puede examinar los recuentos de referencia durante toda la duración de una interfaz en código thunk. Además, obtendrá una indicación del recuento máximo de referencias en esa interfaz thunk.
Nota:
Se puede usar _ATL_DEBUG_INTERFACES en versiones comerciales.
_ATL_DEBUG_QI
Escribe todas las llamadas en QueryInterface
a la ventana de salida.
#define _ATL_DEBUG_QI
Comentarios
Si se produce un error en una llamada a QueryInterface
, la ventana de salida mostrará:
nombre de interfaz - failed
ATLASSERT
La macro ATLASSERT realiza la misma funcionalidad que la macro _ASSERTE que está en la biblioteca en tiempo de ejecución de C.
ATLASSERT(booleanExpression);
Parámetros
booleanExpression
Expresión (incluidos los punteros) que se evalúa como distinto de cero o 0.
Comentarios
En las compilaciones de depuración, ATLASSERT evalúa booleanExpression y genera un informe de depuración cuando el resultado es false.
Requisitos
Encabezado: atldef.h
ATLENSURE
Esta macro se usa para validar los parámetros pasados a una función.
ATLENSURE(booleanExpression);
ATLENSURE_THROW(booleanExpression, hr);
Parámetros
booleanExpression
Especifica una expresión booleana que se va a probar.
Hr
Especifica un código de error que a devolver.
Comentarios
Estas macros proporcionan un mecanismo para detectar y notificar al usuario el uso incorrecto de los parámetros.
La macro llama a ATLASSERT y si se produce un error en la condición llama a AtlThrow
.
En el caso de ATLENSURE, se llama a AtlThrow
con E_FAIL.
En el caso de ATLENSURE_THROW, se llama aAtlThrow
con el VALOR HRESULT especificado.
La diferencia entre ATLENSURE y ATLASSERT es que ATLENSURE lanza una excepción tanto en las compilaciones de versión como en las de depuración.
Ejemplo
void MyImportantFunction(char* psz)
{
ATLENSURE(NULL != psz);
char mysz[64];
strcpy_s(mysz, sizeof(mysz), psz);
}
Requisitos
Encabezado: afx.h
ATLTRACENOTIMPL
En las compilaciones de depuración de ATL, envía la cadena " funcname no está implementada" al dispositivo de volcado de memoria y devuelve E_NOTIMPL.
ATLTRACENOTIMPL(funcname);
Parámetros
funcname
[in] Cadena que contiene el nombre de la función que no está implementada.
Comentarios
En las compilaciones de versión, simplemente devuelve E_NOTIMPL.
Ejemplo
ATLTRACENOTIMPL(_T("IOleControl::GetControlInfo"));
Requisitos
Encabezado: atltrace.h
ATLTRACE
Notifica advertencias a un dispositivo de salida, como la ventana del depurador, según las marcas y los niveles indicados. La compatibilidad con versiones anteriores está incluida.
ATLTRACE(exp);
ATLTRACE(
DWORD category,
UINT level,
LPCSTR lpszFormat, ...);
Parámetros
exp
[in] La cadena y las variables que se van a enviar a la ventana de salida o a cualquier aplicación que intercepte estos mensajes.
category
[in] Tipo de evento o método sobre el que se informa. Vea la lista de categorías en los Comentarios.
level
[in] El nivel de seguimiento del que se va a informar. Consulte la sección de comentarios para obtener más información.
lpszFormat
[in] La cadena con formato que se va a enviar al dispositivo de volcado de memoria.
Comentarios
Consulte ATLTRACE2 para obtener una descripción de ATLTRACE. ATLTRACE y ATLTRACE2 tienen el mismo comportamiento, ATLTRACE se incluye por motivos de compatibilidad con versiones anteriores.
ATLTRACE2
Notifica advertencias a un dispositivo de salida, como la ventana del depurador, según las marcas y los niveles indicados.
ATLTRACE2(exp);
ATLTRACE2(
DWORD category,
UINT level,
LPCSTR lpszFormat, ...);
Parámetros
exp
[in] La cadena que se va a enviar a la ventana de salida o a cualquier aplicación que intercepte estos mensajes.
category
[in] Tipo de evento o método sobre el que se informa. Vea la lista de categorías en los Comentarios.
level
[in] El nivel de seguimiento del que se va a informar. Consulte la sección de comentarios para obtener más información.
lpszFormat
[in] La cadena printf
de formato -style que se va a usar para crear una cadena que se va a enviar al dispositivo de volcado de memoria.
Comentarios
La forma abreviada de ATLTRACE2 escribe una cadena en la ventana de salida del depurador. La segunda forma de ATLTRACE2 también escribe la salida en la ventana de salida del depurador, pero está sujeta a la configuración de la Herramienta de seguimiento de ATL/MFC (consulte Ejemplo ATLTraceTool). Por ejemplo, si establece el nivel en 4 y la Herramienta de seguimiento de ATL/MFC en el nivel 0, no verá el mensaje. el nivel puede ser 0, 1, 2, 3 o 4. El valor predeterminado, 0, informa solo de los problemas más graves.
El parámetro categoría enumera las marcas de seguimiento que se van a establecer. Estas marcas corresponden a los tipos de métodos de los que quiere informar. En las tablas siguientes se enumeran las marcas de seguimiento válidas que puede usar para el parámetro categoría.
Marcas de seguimiento ATL
Categoría ATL | Descripción |
---|---|
atlTraceGeneral |
Informes de todas las aplicaciones ATL. El valor predeterminado. |
atlTraceCOM |
Informes de los métodos COM. |
atlTraceQI |
Informes de las llamadas QueryInterface. |
atlTraceRegistrar |
Informes del registro de objetos. |
atlTraceRefcount |
Informes del número de referencias cambiantes. |
atlTraceWindowing |
Informes de los métodos de Windows; por ejemplo, indica un id. de mapa de mensajes no válido. |
atlTraceControls |
Informes de los controles; por ejemplo, informa cuando se destruye un control o una ventana. |
atlTraceHosting |
Informes de los mensajes hospedados; por ejemplo, informa cuando se activa un cliente en un contenedor. |
atlTraceDBClient |
Informes sobre la plantilla de consumidor OLE DB. Por ejemplo, cuando una llamada a GetData falla, la salida puede contener el HRESULT. |
atlTraceDBProvider |
Informes sobre la plantilla de proveedor OLE DB. Por ejemplo, informa si ha fallado la creación de una columna. |
atlTraceSnapin |
Informes de la aplicación SnapIn de MMC. |
atlTraceNotImpl |
Informa de que la función indicada no está implementada. |
atlTraceAllocation |
Informes de los mensajes impresos por las herramientas de depuración de memoria en atldbgmem.h. |
Marcas de seguimiento de MFC
Categoría MFC | Descripción |
---|---|
traceAppMsg |
De uso general, mensajes de MFC. Siempre se recomienda. |
traceDumpContext |
Mensajes de CDumpContext. |
traceWinMsg |
Mensajes del código de control de los mensajes de MFC. |
traceMemory |
Mensajes del código de administración de la memoria de MFC. |
traceCmdRouting |
Mensajes del código de enrutamiento de los comandos de Windows MFC. |
traceHtml |
Se admiten mensajes de diálogo DHTML de MFC. |
traceSocket |
Mensajes de compatibilidad con sockets de MFC. |
traceOle |
Mensajes de compatibilidad con OLE de MFC. |
traceDatabase |
Mensajes de compatibilidad con la base de datos de MFC. |
traceInternet |
Mensajes de compatibilidad con Internet de MFC. |
Para declarar una categoría de seguimiento personalizada, declare una instancia global de la clase CTraceCategory
como se indica a continuación:
CTraceCategory MY_CATEGORY(_T("MyCategoryName"), 1);
El nombre de la categoría, MY_CATEGORY en este ejemplo, es el nombre que se especifica en el parámetro categoría. El primer parámetro es el nombre de la categoría que aparecerá en la Herramienta de seguimiento de ATL/MFC. El segundo parámetro es el nivel de seguimiento predeterminado. Este parámetro es opcional y el nivel de seguimiento predeterminado es 0.
Para usar una categoría definida por el usuario:
ATLTRACE2(MY_CATEGORY, 2, _T("a message in a custom category"));
Para especificar que quiere filtrar los mensajes de seguimiento, inserte definiciones para estas macros en Stdafx.h antes de la instrucción #include <atlbase.h>
.
También puede establecer el filtro en las directivas de preprocesador en el cuadro de diálogo Páginas de propiedades. Haga clic en la pestaña Preprocesador y, a continuación, inserte el valor global en el cuadro de edición Definiciones del preprocesador.
Atlbase.h contiene definiciones predeterminadas de las macros ATLTRACE2 y estas definiciones se usarán si no define estos símbolos antes de que se procese atlbase.h.
En las compilaciones de versión, ATLTRACE2 se compila a (void) 0
.
ATLTRACE2 limita los contenidos de la cadena que se va a enviar al dispositivo de volcado de memoria a no más de 1023 caracteres, después aplicar el formato.
ATLTRACE y ATLTRACE2 tienen el mismo comportamiento, ATLTRACE se incluye por motivos de compatibilidad con versiones anteriores.
Ejemplo
int i = 1;
ATLTRACE2(atlTraceGeneral, 4, "Integer = %d\n", i);
// Output: 'Integer = 1'
Vea también
Macros
Funciones globales de depuración e informe de errores