Question

Dans MFC C ++ (Visual Studio 6), je suis habitué à utiliser la macro TRACE pour le débogage. Existe-t-il une déclaration équivalente pour le simple win32?

Était-ce utile?

La solution

_RPTn fonctionne très bien, bien que cela ne soit pas aussi pratique. Voici un code qui recrée l'instruction MFC TRACE en tant que fonction permettant un nombre variable d'arguments. Ajoute également une macro TraceEx qui ajoute un préfixe au fichier source et au numéro de ligne afin que vous puissiez cliquer à nouveau sur l'emplacement de l'instruction.

Mise à jour: le code d'origine de CodeGuru ne se compilait pas pour moi en mode publication, j'ai donc modifié la façon dont les instructions TRACE sont supprimées pour le mode publication. Voici ma source complète que j'ai mise dans Trace.h. Merci à Thomas Rizos pour l'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

Autres conseils

À partir des documents msdn, Macros pour la création de rapports :

  

Vous pouvez utiliser les macros _RPTn et _RPTFn, définies dans CRTDBG.H, pour remplacer l’utilisation des instructions printf pour le débogage. Ces macros disparaissent automatiquement dans votre version de publication lorsque _DEBUG n'est pas défini. Il n'est donc pas nécessaire de les inclure dans #ifdefs.

Il existe également OutputDebugString. Cependant, cela ne sera pas supprimé lors de la compilation de la version.

Je viens d'utiliser quelque chose comme ça (de mémoire, pas testé du tout ...)

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

Et puis je peux écrire des choses comme: -

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

Vous pouvez envelopper cela dans certains #ifdefs pour le supprimer dans la version compilée assez facilement.

Macros de traçage qui fournissent des messages avec lien de code source , informations sur la pile d'appel au moment de l'exécution et le prototype de fonction information avec les valeurs de paramètre:

Trace étendue : Macros de trace pour Win32

J'ai constaté que l'utilisation de la macro _RPT () fonctionnera également avec un fichier source C dans Visual Studio 2005. Cet article Débogage avec Visual Studio 2005/2008: Journalisation et suivi fournit une présentation de TRACE, _RPT et d’autres macros de types de journalisation.

Je génère une ligne pour un fichier journal appelé ASSRTLOG qui contient les journaux. Lors de l'écriture du journal dans le fichier, je crée également la ligne de code source suivante:

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

Cette ligne place le même journal que celui-ci dans le fichier journal dans la fenêtre de sortie de l'EDI de Visual Studio 2005.

Vous pourriez être intéressé par les mécanismes derrière l'approche que nous utilisons pour la journalisation. Nous avons une fonction PifLogAbort () qui accepte une série d'arguments qui sont ensuite utilisés pour générer un journal. Ces arguments incluent le nom du fichier dans lequel le journal est généré, ainsi que le numéro de ligne. La macro ressemble à ceci:

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

et le prototype de fonction pour PifLogAbort () ressemblent à ceci:

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

et pour utiliser la macro, nous allons insérer une ligne comme ceci:

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

Ce que cette macro fera, c'est que si le code de retour est inférieur à 0 (l'assertion échoue), un journal sera généré avec le texte fourni. Le journal comprend la condition qui l'a généré, ainsi que le nom du fichier et le numéro de ligne.

La fonction PifLogAbort () génère des journaux avec une longueur spécifiée et traite le fichier de sortie comme un tampon circulaire. Les journaux ont également un horodatage.

Dans les cas où nous souhaitons générer dynamiquement le texte descriptif au moment de l'exécution, peut-être pour fournir la valeur réelle du code d'erreur, nous utilisons la fonction sprintf () avec un tampon, comme dans la séquence de code suivante:

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 nous voulons que les journaux ne soient pas générés, il suffit d’aller dans le fichier d’en-tête unique dans lequel la macro est définie et de le définir comme étant nul, puis de le recompiler. Cependant, nous avons constaté que ces journaux peuvent être très utiles lors de la recherche de problèmes sur le terrain et particulièrement utiles lors des tests d'intégration.

Les événements Windows peuvent remplacer < code> TRACE , en fonction de votre scénario. Le code est compilé dans les configurations Debug et Release. Le suivi des événements peut ensuite être activé et désactivé de manière dynamique, affiché en temps réel ou transféré sur la machine d'un client pour un diagnostic ultérieur. Les traces peuvent également être corrélées avec les informations de trace recueillies à partir d'autres parties du système d'exploitation.

Si vous avez simplement besoin de vider les informations chaque fois que le code atteint certains points de contrôle, ainsi que le contenu variable, les traces de pile ou les noms des appelants, le Les points de trace constituent une option non intrusive.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top