NSLog activé ou désactivé pour le débuggage

ChachaChacha Membre
mars 2007 modifié dans Objective-C, Swift, C, C++ #1
Salut,

Rien de bien fracassant, mais ça fait un bon rappel de l'utilité du travail de certains
Je vous propose la chose suivante :
<br />#ifdef DEBUG_LOG<br />#define DebugLog(log,...) NSLog(@&quot;[%@ %s] &#092;&quot;%@&#092;&quot;&quot;,[self class],sel_getName(_cmd),[NSString stringWithFormat:log,##__VA_ARGS__])<br />#else<br />#define DebugLog(log,...)<br />#endif<br />

Si vous utilisez DebugLog dans votre code, vous pouvez décider d'activer ou pas le message correspondant en définissant ou pas la macro DEBUG_LOG
Par exemple, en mode Deployment, il suffit juste de ne pas définir DEBUG_LOG pour supprimer tous les messages.

Notez un apport technique un peu particulier : le ##__VA_ARGS__
Pourquoi ## ?
Je vous laisse chercher la phrase suivante

Second, the `##' token paste operator has a special meaning when placed between a comma and a variable argument.

dans la doc de gcc : http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

Quelques autres idées :
<br />extern int UseDebugLog;<br />#define DebugLog(log,...) if (UseDebugLog) NSLog(@&quot;[%@ %s] &#092;&quot;%@&#092;&quot;&quot;,[self class],sel_getName(_cmd),[NSString stringWithFormat:log,##__VA_ARGS__]);<br /><br />//et quelque part dans le main.m<br />int UseDebugLog; //variable globale<br />

et vous mettez 1 ou 0 dans UseDebugLog en fonction de argv[]. Vous pouvez ainsi ajouter une option du style "-v" à  votre programme pour activer certains logs.
L'Utilité ? Si un de vos utilisateurs voit son programme planter, vous pouvez lui demander de lancer le programme avec l'option -v pour obtenir des infos plus précises sur le déroulement du code... et sans recompiler !
On peut même s'amuser à  définir plusieurs niveaux de warnings.
<br />extern int DebugLogLevel;<br />#define DebugLog(level,log,...) if (DebugLogLevel &gt;= level) NSLog(@&quot;[%@ %s] &#092;&quot;%@&#092;&quot;&quot;,[self class],sel_getName(_cmd),[NSString stringWithFormat:log,##__VA_ARGS__])<br />


+
Chacha

[edit]
En conformité avec le message http://www.objective-cocoa.org/forum/index.php/topic,1740.msg21029.html#msg21029, j'ai bien modifié _cmd en sel_getName(_cmd)
[/edit]

Réponses

  • schlumschlum Membre
    mars 2007 modifié #2
    Un truc intéressant dans les macros aussi, c'est l'utilisation de  __FILE__ et __LINE__
    Mieux que [self class] et _cmd je trouve  ;)

    (on peut savoir si on est dans une catégorie, et dans une méthode longue, où on est précisément !)

    À user et abuser dans un système d'exceptions imbriquées !
  • Philippe49Philippe49 Membre
    août 2007 modifié #3
    dans 1175086950:

    Un truc intéressant dans les macros aussi, c'est l'utilisation de  __FILE__ et __LINE__
    Mieux que [self class] et _cmd je trouve  ;)

    (on peut savoir si on est dans une catégorie, et dans une méthode longue, où on est précisément !)

    À user et abuser dans un système d'exceptions imbriquées !


    Cela donne l'idée d'une macro comme
    #define LOGCMD fprintf(stderr,"
    %s in %s, %d\n",_cmd,strrchr(__FILE__,'/')+1,__LINE__)

    avec en sortie

    theMethod:  in AppController.m, 22

    Ok sur les réglages ??


    [Fichier joint supprimé par l'administrateur]
  • schlumschlum Membre
    août 2007 modifié #4
    Oui, ça devrait fonctionner...

    Faudrait juste mettre "sel_getName(_cmd)" à  la place de "_cmd"
  • Philippe49Philippe49 Membre
    05:12 modifié #5
    dans 1188482475:

    Faudrait juste mettre "sel_getName(_cmd)" à  la place de "_cmd"


    oui _cmd est de type SEL
    et si on a peur de l'absence d'un / dans __FILE__

    #define LOGCMD    fprintf(stderr,"
    %s in %s, %d\n",sel_getName(_cmd),strrchr(__FILE__,'/')? strrchr(__FILE__,'/')+1:__FILE__ , __LINE__)
  • 05:12 modifié #6
    Et pourquoi pas NSLog au lieu de fprintf?

    L'habitude peut certes être une raison valable s'il n'y a pas de différence "fonctionnelle" entre les 2, mais là  il y en a une, et une belle en plus: le %@ qui me semble un peu incontournable en objc (et le %C aussi, dans une moindre mesure).
  • Philippe49Philippe49 Membre
    05:12 modifié #7
    dans 1188513623:

    Et pourquoi pas NSLog au lieu de fprintf?



    La seconde, c'est pour formater sans le baratin des NSLog qu'on ne lit pas ...

    Quelqu'un sait-il si la présentation du NSLog est réglable ?
  • août 2007 modifié #8
    Du baratin dans NSLog?

    [tt]fprintf(stderr,"test");
    NSLog(@test);[/tt]

    Il est plutôt du côté de fprintf le baratin non?

    Mais bon, tu ne trouves pas un peu "bizarre" de définir une macro qui ne peut être utilisée que à  l'intérieur d'une méthode (car il n'y a que là  que _cmd est défini), et de ne même pas pouvoir mettre des objets dans le log? Tu n'aurais pas mis le _cmd, je n'aurais rien dit, mais là  y a un truc qui m'échappe.

    Qu'est-ce que tu appelles "présentation réglable"?
  • Philippe49Philippe49 Membre
    05:12 modifié #9
    dans 1188514558:

    Du baratin dans NSLog?

    [tt]fprintf(stderr,"test");
    NSLog(@test);[/tt]

    Il est plutôt du côté de fprintf le baratin non?

    Qu'est-ce que tu appelles "présentation réglable"?

    Je parle de l'élégance dans le fichier log.
    Ce que je ne lis jamais, c'est ce qui est en gras.

    2007-08-31 01:00:26.946 pList_editor[6673] applicationDidFinishLaunching: AppController.m, 22

    applicationDidFinishLaunching: in AppController.m, 22
  • Philippe49Philippe49 Membre
    05:12 modifié #10
    dans 1188514558:

    Mais bon, tu ne trouves pas un peu "bizarre" de définir une macro qui ne peut être utilisée que à  l'intérieur d'une méthode (car il n'y a que là  que _cmd est défini), et de ne même pas pouvoir mettre des objets dans le log? Tu n'aurais pas mis le _cmd, je n'aurais rien dit, mais là  y a un truc qui m'échappe.


    Je trouve pratique de savoir dans quelle méthode je suis lors de l'utilisation de plusieurs mouchards. On a aussi également souvent de faire le point sur l'ordre dans lequel les méthodes sont appelées. Cette macro ne sert qu'à  cela, et ne prétend pas remplacer NSLog. 
  • 05:12 modifié #11
    ok, au temps pour moi. Il est temps que j'aille dormir.
Connectez-vous ou Inscrivez-vous pour répondre.