Question Comment imprimer le nom de la méthode et son numéro de ligne et désactiver conditionnellement NSLog?


Je fais une présentation sur le débogage dans Xcode et j'aimerais obtenir plus d'informations sur l'utilisation efficace de NSLog.

En particulier, j'ai deux questions:

  • existe-t-il un moyen de NSLog facilement le nom / numéro de ligne de la méthode actuelle?
  • est-il un moyen de "désactiver" tous les NSLogs facilement avant de compiler pour le code de version?

438
2018-06-09 09:44


origine


Réponses:


Voici quelques macros utiles autour de NSLog que j'utilise beaucoup:

#ifdef DEBUG
#   define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#   define DLog(...)
#endif

// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)

La macro DLog est utilisée pour produire uniquement lorsque la variable DEBUG est définie (-DDEBUG dans les indicateurs C du projet pour la configuration de débogage).

ALog produira toujours du texte (comme le NSLog standard).

La sortie (par exemple, ALog (@ "Hello world")) ressemblera à ceci:

-[LibraryController awakeFromNib] [Line 364] Hello world

580
2018-06-09 10:37



J'ai pris DLog et ALog d'en haut, et ajouté ULog qui soulève un UIAlertView message.

Résumer:

  • DLog va sortir comme NSLog uniquement lorsque la variable DEBUG est définie
  • ALog sortira toujours comme NSLog
  • ULog montrera le UIAlertView uniquement lorsque la variable DEBUG est définie
#ifdef DEBUG
# définir DLog (fmt, ...) NSLog ((@ "% s [ligne% d]" fmt), __PRETTY_FUNCTION__, __LINE__, ## __ VA_ARGS__);
#autre
# définir DLog (...)
#fin si
#define ALog (fmt, ...) NSLog ((@ "% s [ligne% d]" fmt), __PRETTY_FUNCTION__, __LINE__, ## __ VA_ARGS__);
#ifdef DEBUG
# définir ULog (fmt, ...) {UIAlertView * alert = [[UIAlertView alloc] initWithTitle: [NSString stringWithFormat: @ "% s \ n [ligne% d]", __PRETTY_FUNCTION__, __LINE__] message: [NSString stringWithFormat: fmt , ## __ VA_ARGS__] délégué: nil cancelButtonTitle: @ "Ok" otherButtonTitles: nil]; [émission d'alerte]; }
#autre
# définir ULog (...)
#fin si

Voici à quoi ça ressemble:

Debug UIAlertView

+1 Diederik


141
2017-08-10 20:57



NSLog(@"%s %d %s %s", __FILE__, __LINE__, __PRETTY_FUNCTION__, __FUNCTION__);

Affiche le nom du fichier, le numéro de ligne et le nom de la fonction:

/proj/cocoa/cdcli/cdcli.m 121 managedObjectContext managedObjectContext

__FUNCTION__ en C ++ montre le nom brouillé __PRETTY_FUNCTION__ montre un joli nom de fonction, dans le cacao ils se ressemblent.

Je ne sais pas quelle est la bonne façon de désactiver NSLog, j'ai fait:

#define NSLog

Et aucune sortie de journalisation n'est apparue, mais je ne sais pas si cela a des effets secondaires.


73
2018-06-09 10:32



Voici une grande collection de constantes de débogage que nous utilisons. Prendre plaisir.

// Uncomment the defitions to show additional info.

//  #define DEBUG

//  #define DEBUGWHERE_SHOWFULLINFO

//  #define DEBUG_SHOWLINES
//  #define DEBUG_SHOWFULLPATH
//  #define DEBUG_SHOWSEPARATORS
//  #define DEBUG_SHOWFULLINFO


// Definition of DEBUG functions. Only work if DEBUG is defined.
#ifdef DEBUG 

    #define debug_separator() NSLog( @"────────────────────────────────────────────────────────────────────────────" );

    #ifdef DEBUG_SHOWSEPARATORS
        #define debug_showSeparators() debug_separator();
    #else
        #define debug_showSeparators()
    #endif

    /// /// /// ////// ///// 

    #ifdef DEBUG_SHOWFULLPATH
        #define debug_whereFull() debug_showSeparators(); NSLog(@"Line:%d : %s : %s", __LINE__,__FILE__,__FUNCTION__); debug_showSeparators(); 
    #else
        #define debug_whereFull() debug_showSeparators(); NSLog(@"Line:%d : %s : %s", __LINE__,[ [ [ [NSString alloc] initWithBytes:__FILE__ length:strlen(__FILE__) encoding:NSUTF8StringEncoding] lastPathComponent] UTF8String ] ,__FUNCTION__); debug_showSeparators(); 
    #endif

    /// /// /// ////// ///// 

    #define debugExt(args,...) debug_separator(); debug_whereFull(); NSLog( args, ##__VA_ARGS__); debug_separator();

    /// /// /// ////// ///// Debug Print Macros

    #ifdef DEBUG_SHOWFULLINFO
        #define debug(args,...) debugExt(args, ##__VA_ARGS__);
    #else
        #ifdef DEBUG_SHOWLINES
            #define debug(args,...) debug_showSeparators(); NSLog([ NSString stringWithFormat:@"Line:%d : %@", __LINE__, args ], ##__VA_ARGS__); debug_showSeparators();
        #else
            #define debug(args,...) debug_showSeparators(); NSLog(args, ##__VA_ARGS__); debug_showSeparators();
        #endif
    #endif

    /// /// /// ////// ///// Debug Specific Types

    #define debug_object( arg ) debug( @"Object: %@", arg );
    #define debug_int( arg ) debug( @"integer: %i", arg );
    #define debug_float( arg ) debug( @"float: %f", arg );
    #define debug_rect( arg ) debug( @"CGRect ( %f, %f, %f, %f)", arg.origin.x, arg.origin.y, arg.size.width, arg.size.height );
    #define debug_point( arg ) debug( @"CGPoint ( %f, %f )", arg.x, arg.y );
    #define debug_bool( arg )   debug( @"Boolean: %@", ( arg == YES ? @"YES" : @"NO" ) );

    /// /// /// ////// ///// Debug Where Macros

    #ifdef DEBUGWHERE_SHOWFULLINFO
        #define debug_where() debug_whereFull(); 
    #else
        #define debug_where() debug(@"%s",__FUNCTION__); 
    #endif

    #define debug_where_separators() debug_separator(); debug_where(); debug_separator();

    /// /// /// ////// /////

#else
    #define debug(args,...) 
    #define debug_separator()  
    #define debug_where()   
    #define debug_where_separators()  
    #define debug_whereFull()   
    #define debugExt(args,...)
    #define debug_object( arg ) 
    #define debug_int( arg ) 
    #define debug_rect( arg )   
    #define debug_bool( arg )   
    #define debug_point( arg )
    #define debug_float( arg )
#endif

20
2017-11-04 17:35



Il y a un nouveau truc qu'aucune réponse ne donne. Vous pouvez utiliser printf au lieu NSLog. Cela vous donnera un journal propre:

Avec NSLog vous obtenez des choses comme ça:

2011-11-03 13:43:55.632 myApp[3739:207] Hello Word

Mais avec printf vous obtenez seulement:

Hello World

Utilisez ce code

#ifdef DEBUG
    #define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
    #define NSLog(...) {}              
#endif

19
2017-11-03 15:49



Ma réponse à cette question pourrait aider, ressemble à celui que Diederik a préparé. Vous pouvez également remplacer l'appel à NSLog() avec une instance statique de votre propre classe de journalisation personnalisée, vous pouvez ajouter un indicateur de priorité pour les messages de débogage / avertissement / erreur, envoyer des messages à un fichier ou à une base de données ou à la console ou à peu près.

#define DEBUG_MODE

#ifdef DEBUG_MODE
    #define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, 
              [[NSString stringWithUTF8String:__FILE__] lastPathComponent], 
              __LINE__, 
              [NSString stringWithFormat:(s), 
              ##__VA_ARGS__] )
#else
    #define DebugLog( s, ... ) 
#endif

16
2018-06-09 12:28



Désactiver tous les NSLogs, pour quelqu'un allergique aux MACROS, voici quelque chose que vous pouvez aussi compiler:

void SJLog(NSString *format,...)
{
    if(LOG)
    {   
        va_list args;
        va_start(args,format);
        NSLogv(format, args);
        va_end(args);
    }
}

Et, utilisez-le presque comme NSLog:

SJLog(@"bye bye NSLogs !");

De ce blog: http://whackylabs.com/rants/?p=134


13
2018-01-19 23:21



Pour compléter les réponses ci-dessus, il peut être très utile d'utiliser un remplacement de NSLog dans certaines situations, en particulier lors du débogage. Par exemple, se débarrasser de toutes les informations de nom / identifiant de date et de processus sur chaque ligne peut rendre la sortie plus lisible et plus rapide à démarrer.

Le lien suivant fournit un peu de munitions utiles pour rendre la journalisation simple beaucoup plus agréable.

http://cocoaheads.byu.edu/wiki/a-different-nslog


11
2018-06-10 06:11



Il est facile de changer vos NSLogs existants pour afficher le numéro de ligne et la classe à partir de laquelle ils sont appelés. Ajoutez une ligne de code à votre fichier de préfixe:

#define NSLog(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)

11
2018-03-02 00:29



C'est simple, par exemple

- (void) applicationWillEnterForeground: (UIApplication *) application {

    NSLog(@"%s", __PRETTY_FUNCTION__);

}

Sortie: - [AppDelegate applicationWillEnterForeground:]


6
2018-01-29 07:18



Construire au-dessus des réponses ci-dessus, voici ce que j'ai plagié et est venu avec. Ajout de la journalisation de la mémoire

#import <mach/mach.h>

#ifdef DEBUG
#   define DebugLog(fmt, ...) NSLog((@"%s(%d) " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#   define DebugLog(...)
#endif


#define AlwaysLog(fmt, ...) NSLog((@"%s(%d) " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);


#ifdef DEBUG
#   define AlertLog(fmt, ...)  { \
    UIAlertView *alert = [[UIAlertView alloc] \
            initWithTitle : [NSString stringWithFormat:@"%s(Line: %d) ", __PRETTY_FUNCTION__, __LINE__]\
                  message : [NSString stringWithFormat : fmt, ##__VA_ARGS__]\
                 delegate : nil\
        cancelButtonTitle : @"Ok"\
        otherButtonTitles : nil];\
    [alert show];\
}
#else
#   define AlertLog(...)
#endif



#ifdef DEBUG
#   define DPFLog NSLog(@"%s(%d)", __PRETTY_FUNCTION__, __LINE__);//Debug Pretty Function Log
#else
#   define DPFLog
#endif


#ifdef DEBUG
#   define MemoryLog {\
    struct task_basic_info info;\
    mach_msg_type_number_t size = sizeof(info);\
    kern_return_t e = task_info(mach_task_self(),\
                                   TASK_BASIC_INFO,\
                                   (task_info_t)&info,\
                                   &size);\
    if(KERN_SUCCESS == e) {\
        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; \
        [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; \
        DebugLog(@"%@ bytes", [formatter stringFromNumber:[NSNumber numberWithInteger:info.resident_size]]);\
    } else {\
        DebugLog(@"Error with task_info(): %s", mach_error_string(e));\
    }\
}
#else
#   define MemoryLog
#endif

5
2018-01-09 02:03