Pregunta

En MFC C ++ (Visual Studio 6) estoy acostumbrado a usar la macro TRACE para la depuración. ¿Hay una declaración equivalente para win32 simple?

¿Fue útil?

Solución

_RPTn funciona muy bien, aunque no es tan conveniente. Aquí hay un código que recrea la instrucción MFC TRACE como una función permitiendo un número variable de argumentos. También agrega la macro TraceEx que antepone el archivo fuente y el número de línea para que pueda volver a la ubicación de la declaración.

Actualización: el código original en CodeGuru no se compilaría para mí en modo Release, por lo que cambié la forma en que se eliminan las declaraciones TRACE para el modo Release. Aquí está mi fuente completa que puse en Trace.h. Gracias a Thomas Rizos por el original :

// TRACE macro for win32
#ifndef __TRACE_H__850CE873
#define __TRACE_H__850CE873

#include <crtdbg.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>

#ifdef _DEBUG
#define TRACEMAXSTRING  1024

char szBuffer[TRACEMAXSTRING];
inline void TRACE(const char* format,...)
{
    va_list args;
    va_start(args,format);
    int nBuf;
    nBuf = _vsnprintf(szBuffer,
                   TRACEMAXSTRING,
                   format,
                   args);
    va_end(args);

    _RPT0(_CRT_WARN,szBuffer);
}
#define TRACEF _snprintf(szBuffer,TRACEMAXSTRING,"%s(%d): ", \
                &strrchr(__FILE__,'\\')[1],__LINE__); \
                _RPT0(_CRT_WARN,szBuffer); \
                TRACE
#else
// Remove for release mode
#define TRACE  ((void)0)
#define TRACEF ((void)0)
#endif

#endif // __TRACE_H__850CE873

Otros consejos

De los documentos msdn, Macros para informes :

  

Puede usar las macros _RPTn y _RPTFn, definidas en CRTDBG.H, para reemplazar el uso de sentencias printf para la depuración. Estas macros desaparecen automáticamente en su versión de lanzamiento cuando _DEBUG no está definido, por lo que no es necesario encerrarlas en #ifdefs.

También hay OutputDebugString. Sin embargo, eso no se eliminará al compilar la versión.

Solo uso algo como esto (de memoria, no probado en absoluto ...)

#define TRACE(msg) {\
    std::ostringstream ss; \
    ss << msg << "\n"; \
    OutputDebugString(msg.str()); \
}

Y luego puedo escribir cosas como: -

TRACE("MyClass::MyFunction returned " << value << " with data=" << some.data);

Puede envolverlo en algunos #ifdefs para eliminarlo en versiones de lanzamiento con bastante facilidad.

Rastrear macros que proporcionan mensajes con enlace de código fuente , información de pila de llamadas en tiempo de ejecución y prototipo de función información con valores de parámetros:

Seguimiento extendido : seguimiento de macros para Win32

Descubrí que usar la macro _RPT () también funcionará con un archivo fuente C en Visual Studio 2005. Este artículo Depuración con Visual Studio 2005/2008: Logging and Tracing proporciona una descripción general de TRACE, _RPT y otras macros de tipo de registro.

Genero una línea para un archivo de registro llamado ASSRTLOG que contiene registros y, al escribir el registro en el archivo, también hago la siguiente línea de código fuente:

_RPT1(_CRT_WARN, "ASSRTLOG: %s", szLog1);

Esta línea coloca el mismo registro que va al archivo de registro en la ventana de salida del IDE de Visual Studio 2005.

Puede interesarle la mecánica detrás del enfoque que estamos utilizando para iniciar sesión. Tenemos una función PifLogAbort () que acepta una serie de argumentos que luego se utilizan para generar un registro. Estos argumentos incluyen el nombre del archivo donde se genera el registro junto con el número de línea. La macro se ve así:

#define NHPOS_ASSERT_TEXT(x, txt) if (!(x)) { PifLogAbort( (UCHAR *)  #x , (UCHAR *)  __FILE__ , (UCHAR *) txt , __LINE__ );}

y el prototipo de función para PifLogAbort () se ven así:

PifLogNoAbort(UCHAR *lpCondition, UCHAR *lpFilename, UCHAR *lpFunctionname, ULONG ulLineNo)

y para usar la macro insertaremos una línea como esta:

NHPOS_ASSERT_TEXT(sBRetCode >= 0, "CliEtkTimeIn():  EtkTimeIn() returned error");

Lo que hará esta macro es que si el código de retorno es menor que 0 (la aserción falla), se generará un registro con el texto proporcionado. El registro incluye la condición que generó el registro junto con el nombre del archivo y el número de línea.

La función PifLogAbort () genera registros con una longitud especificada y trata el archivo de salida como un búfer circular. Los registros también tienen un sello de fecha y hora.

En aquellos casos en los que queremos generar el texto descriptivo dinámicamente en tiempo de ejecución, quizás para proporcionar el valor del código de error real, usamos la función sprintf () con un búfer como en la siguiente secuencia de código:

if (sErrorSave != STUB_BM_DOWN) {
    char xBuff[128];
    sprintf(xBuff, "CstSendBMasterFH: CstComReadStatus() - 0x%x, sError = %d", usCstComReadStatus, CliMsg.sError);
    NHPOS_ASSERT_TEXT((sErrorSave == STUB_BM_DOWN), xBuff);
}

Si queremos que los registros no se generen, todo lo que tenemos que hacer es ir al archivo de encabezado único donde se define la macro y definir que no sea nada, luego recompilar. Sin embargo, hemos descubierto que estos registros pueden ser muy valiosos al investigar problemas de campo y son especialmente útiles durante las pruebas de integración.

Los eventos de Windows son un reemplazo potencial para < code> TRACE macros, dependiendo de su escenario particular. El código se compila en las configuraciones Debug y Release. El seguimiento de eventos puede activarse y desactivarse dinámicamente, mostrarse en tiempo real o descargarse en la máquina de un cliente para un diagnóstico posterior. Los rastreos también se pueden correlacionar con la información de rastreo recopilada de otras partes del sistema operativo.

Si simplemente necesita volcar información cada vez que el código llega a ciertos puntos de control, junto con contenido variable, seguimientos de pila o nombres de llamantes, Los puntos de seguimiento son una opción no intrusiva para hacerlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top