NSLog activé ou désactivé pour le débuggage
Chacha
Membre
Salut,
Rien de bien fracassant, mais ça fait un bon rappel de l'utilité du travail de certains
Je vous propose la chose suivante :
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
dans la doc de gcc : http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
Quelques autres idées :
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.
+
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]
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(@"[%@ %s] \"%@\"",[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(@"[%@ %s] \"%@\"",[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 >= level) NSLog(@"[%@ %s] \"%@\"",[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]
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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]
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__)
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).
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 ?
[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"?
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
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.