Macros pour la création de rapports

 

Pour obtenir la dernière documentation sur Visual Studio 2017, consultez Documentation Visual Studio 2017.

Vous pouvez employer les macros _RPTn et _RPTFn, définies dans CRTDBG.H, au lieu d'utiliser des instructions printf pour le débogage. Ces macros disparaissent automatiquement dans votre version Release lorsque _DEBUG n'est pas défini ; il est donc inutile de les placer entre des #ifdef.

MacroDescription
_RPT0, _RPT1, _RPT2, _RPT3, _RPT4Sort une chaîne de message et zéro à quatre arguments. Pour _RPT1 à _RPT4, la chaîne de message fait office de chaîne de mise en forme du style printf pour les arguments.
_RPTF0, _RPTF1, ,_RPTF2, _RPTF4Ces macros sont identiques à _RPTn, mais elles sortent également le nom du fichier et le numéro de la ligne où est située la macro.

Prenons l'exemple suivant :

#ifdef _DEBUG  
    if ( someVar > MAX_SOMEVAR )  
        printf( "OVERFLOW! In NameOfThisFunc( ),  
               someVar=%d, otherVar=%d.\n",  
               someVar, otherVar );  
#endif  

Ce code sort les valeurs de someVar et de otherVar dans stdout. Vous pouvez utiliser l'appel suivant à _RPTF2 pour reporter ces mêmes valeurs et, en outre, le nom de fichier et le numéro de ligne:

if (someVar > MAX_SOMEVAR) _RPTF2(_CRT_WARN, "In NameOfThisFunc( ), someVar= %d, otherVar= %d\n", someVar, otherVar );  

Si vous constatez qu'une application particulière nécessite des rapports de débogage que les macros distribuées avec la bibliothèque Runtime C ne fournissent pas, vous pouvez écrire une macro conçue spécialement pour répondre à vos besoins. Dans l'un de vos fichiers d'en-tête, par exemple, vous pourriez inclure un code semblable au suivant pour définir une macro intitulée ALERT_IF2 :

#ifndef _DEBUG                  /* For RELEASE builds */  
#define  ALERT_IF2(expr, msg, arg1, arg2)  do {} while (0)  
#else                           /* For DEBUG builds   */  
#define  ALERT_IF2(expr, msg, arg1, arg2) \  
    do { \  
        if ((expr) && \  
            (1 == _CrtDbgReport(_CRT_ERROR, \  
                __FILE__, __LINE__, msg, arg1, arg2))) \  
            _CrtDbgBreak( ); \  
    } while (0)  
#endif  

Un appel à ALERT_IF2 pourrait exécuter toutes les fonctions du code printf au début de cette rubrique :

ALERT_IF2(someVar > MAX_SOMEVAR, "OVERFLOW! In NameOfThisFunc( ),   
someVar=%d, otherVar=%d.\n", someVar, otherVar );  

Étant donné que vous pouvez facilement modifier une macro personnalisée pour reporter une quantité d'informations plus ou moins grande vers différentes destinations (suivant ce qui est le plus pratique), cette approche peut se révéler particulièrement utile au fur et à mesure que vos besoins de débogage évoluent.

Techniques de débogage CRT

Afficher: