Pergunta

Em MFC C ++ (Visual Studio 6) Estou acostumado a usar a macro TRACE para depuração. Existe uma declaração equivalente para win32 simples?

Foi útil?

Solução

_RPTn funciona muito bem, embora não tão conveniente. Aqui estão algumas código que recria a declaração MFC TRACE como uma função permitindo número variável de argumentos. Também acrescenta TraceEx macro que prepends arquivo de origem eo número da linha para que você possa clicar em voltar para o local da declaração.

Update: O código original em CodeGuru não compilar para mim no modo de versão então eu mudei a maneira que instruções de rastreamento são removidos para o modo Release. Aqui é a minha fonte completo que eu colocar em Trace.h. Graças a Thomas Rizos para o 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

Outras dicas

De docs MSDN, Macros para o Reporting :

Você pode usar o _RPTn, e macros _RPTFn, definido no crtdbg.h, para substituir o uso de declarações printf para depuração. Estas macros automaticamente desaparecem em sua compilação de lançamento, quando _DEBUG não está definido, por isso não há necessidade de colocá-los em #ifdefs.

Há também OutputDebugString. No entanto isso não será removido quando a compilação de lançamento.

Eu só usar algo como isto (de memória, não testada em tudo ...)

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

E então eu posso escrever coisas como: -

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

Você pode dispor que em alguns #ifdefs para removê-lo em compilações com bastante facilidade.

macros de rastreamento que fornecem mensagens com ligação código source , em tempo de execução callstack informações, e Função protótipo informações com os valores dos parâmetros:

Extensão de rastreamento : macros de rastreamento para Win32

Eu achei que o uso da macro _RPT() também irá trabalhar com um arquivo de origem C no Visual Studio 2005. Este artigo depuração com Visual Studio 2005/2008:. registro e rastreamento fornece uma visão geral do TRACE, _RPT e outras macros tipo de registro

Eu gerar uma linha de um arquivo de log chamado ASSRTLOG que contém registos e ao escrever o log para o arquivo, eu também faça o seguinte linha de código fonte:

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

Esta linha coloca o mesmo registo que está indo para o arquivo de log na janela de saída do IDE Visual Studio 2005.

Você pode estar interessado na mecânica por trás da abordagem que estamos usando para fazer logon. Temos um PifLogAbort() função que aceita uma série de argumentos que são então usados ??para gerar um log. Esses argumentos incluem o nome do arquivo onde o log está sendo gerado, juntamente com o número da linha. Os olhares macro como este:

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

e o protótipo da função para olhar PifLogAbort() assim:

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

e utilizar a macro que irá inserir uma linha como esta:

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

Esta macro vai fazer é que, se o código de retorno é menor que 0 (a afirmação de falha), um log será gerado com o texto fornecido. O registo inclui a condição que gerou o log junto com o nome do arquivo e número da linha.

A função PifLogAbort() gera logs com um comprimento especificado e trata o ficheiro de saída como uma memória tampão circular. Os registros têm uma hora e data também.

Nos casos em que queremos gerar o texto descritivo dinamicamente em tempo de execução, talvez para fornecer o valor do código de erro real, usamos a função () sprintf com um tampão como na seqüência código a seguir:

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 queremos que as toras para não ser gerado, tudo o que precisamos fazer é ir para o arquivo de cabeçalho único onde a macro é definido e defini-lo para ser nada, então recompilação. No entanto, descobrimos que esses logs pode ser muito valiosa quando se investiga questões de campo e são especialmente úteis durante os testes de integração.

do Windows Eventos são um substituto potencial para TRACE macros, dependendo do cenário particular. O código é compilado em ambas as configurações Debug e Release. rastreamento de evento pode ser ativado de forma dinâmica e deficientes, exibida em tempo real, ou jogados na máquina do cliente para o diagnóstico mais tarde. Os traços podem ser correlacionados com informações de rastreamento recolhidas a partir de outras partes do sistema operacional também.

Se você só precisa de informações despejo sempre que o código atinge certos pontos de verificação, juntamente com conteúdo variável, rastreamentos de pilha, ou os nomes dos chamadores, Visual Studio tracePoints são uma opção não-intrusiva para fazê-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top