NSLog activé ou désactivé pour le débuggage
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.