Domanda

In MFC C ++ (Visual Studio 6) sono abituato a utilizzare la macro TRACE per il debug. Esiste una dichiarazione equivalente per la semplice win32?

È stato utile?

Soluzione

_RPTn funziona alla grande, anche se non altrettanto conveniente. Ecco del codice che ricrea l'istruzione MFC TRACE come funzione permettendo un numero variabile di argomenti. Aggiunge anche la macro TraceEx che antepone il file di origine e il numero di riga in modo da poter fare nuovamente clic sulla posizione dell'istruzione.

Aggiornamento: il codice originale su CodeGuru non è stato compilato per me in modalità Rilascio, quindi ho cambiato il modo in cui le istruzioni TRACE vengono rimosse per la modalità Rilascio. Ecco la mia fonte completa che ho inserito in Trace.h. Grazie a Thomas Rizos per l'originale :

// 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

Altri suggerimenti

Dai documenti msdn, Macro per la segnalazione :

  

È possibile utilizzare le macro _RPTn e _RPTFn, definite in CRTDBG.H, per sostituire l'uso delle istruzioni printf per il debug. Queste macro scompaiono automaticamente nella build di rilascio quando _DEBUG non è definito, quindi non è necessario racchiuderle in #ifdefs.

Esiste anche OutputDebugString. Tuttavia, ciò non verrà rimosso durante la compilazione della versione.

Uso solo qualcosa del genere (dalla memoria, non testato affatto ...)

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

E poi posso scrivere cose come: -

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

Puoi racchiuderlo in alcuni #ifdefs per rimuoverlo nelle build di rilascio abbastanza facilmente.

Macro di traccia che forniscono messaggi con link al codice sorgente , informazioni sul callstuntime runtime e prototipo di funzione informazioni con valori di parametro:

Traccia estesa : traccia le macro per Win32

Ho scoperto che l'uso della macro _RPT () funzionerà anche con un file sorgente C in Visual Studio 2005. Questo articolo Debug con Visual Studio 2005/2008: registrazione e traccia fornisce una panoramica di TRACE, _RPT e altre macro di tipo di registrazione.

Genero una riga per un file di registro chiamata ASSRTLOG che contiene i log e quando scrivo il log nel file, faccio anche la seguente riga del codice sorgente:

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

Questa riga inserisce lo stesso registro che sta andando nel file di registro nella finestra di output dell'IDE di Visual Studio 2005.

Potresti essere interessato ai meccanismi alla base dell'approccio che stiamo utilizzando per la registrazione. Abbiamo una funzione PifLogAbort () che accetta una serie di argomenti che vengono quindi utilizzati per generare un registro. Questi argomenti includono il nome del file in cui viene generato il registro insieme al numero di riga. La macro è simile alla seguente:

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

e il prototipo della funzione per PifLogAbort () si presentano così:

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

e per usare la macro inseriremo una riga come questa:

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

Quello che farà questa macro è che se il codice di ritorno è inferiore a 0 (l'asserzione fallisce), verrà generato un registro con il testo fornito. Il registro include la condizione che ha generato il registro insieme al nome del file e al numero di riga.

La funzione PifLogAbort () genera registri con una lunghezza specificata e tratta il file di output come un buffer circolare. Anche i registri hanno un timbro di data e ora.

Nei casi in cui vogliamo generare dinamicamente il testo descrittivo in fase di esecuzione, forse per fornire il valore effettivo del codice di errore, utilizziamo la funzione sprintf () con un buffer come nella seguente sequenza di codice:

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);
}

Se vogliamo che i log non vengano generati, tutto ciò che dobbiamo fare è andare al singolo file di intestazione in cui è definita la macro e definirla come nulla quindi ricompilare. Tuttavia, abbiamo scoperto che questi registri possono essere molto utili quando si esaminano i problemi sul campo e sono particolarmente utili durante i test di integrazione.

Eventi di Windows sono un potenziale sostituto di < code> TRACE , a seconda del tuo scenario particolare. Il codice viene compilato in entrambe le configurazioni Debug e Release. La traccia degli eventi può quindi essere abilitata e disabilitata in modo dinamico, visualizzata in tempo reale o scaricata sul computer di un cliente per una diagnosi successiva. Le tracce possono essere correlate con le informazioni di traccia raccolte anche da altre parti del sistema operativo.

Se hai semplicemente bisogno di scaricare informazioni ogni volta che il codice raggiunge determinati checkpoint, insieme a contenuto variabile, tracce di stack o nomi di chiamanti, I tracepoints sono un'opzione non intrusiva per farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top