• # J'ai eu ma période ...

    Posté par . En réponse au journal printf debugging considered harmful. Évalué à 10.

    Mais parfois on a pas trop le choix : Pendant un stage, je devais faire une palette pour interface builder sous MacOSX (un extension de l'éditeur d'UI en gros). Le hic c'est que je codais ca sur un iMac G3 avec 392Mo de RAM, sous Tiger ... et pour débugger ma palette, il fallait débugger Interface Builder en entier avec XCode, les connaisseurs souriront en disant "le pauvre". Du coup la méthode la plus rapide pour certains bug était le printf (enfin NSLog() ici plutôt :) ) logging, mais grace a mon expérience de débutant en C passée, j'avais quelques bonne techniques, triviales, mais je vais les partager tout de même. Comme tu le dis une bonne vieille macros avec des __VA_ARGS__ roxor, mais très vite ca ne suffit plus, et on ne peut pas profiter facilement des macros __FUNCTION__, __FILE__, __LINE__ a moins de se les taper a chaque fois. donc voilà quoi :
    # define debug(...) fprintf(stderr,"%s : %s, line %i : ",\
     __FILE__, __FUNCTION__, __LINE__);\
     fprintf(stderr, __VA_ARGS__)
     
    Bon après tu peux y aller encore plus comme un bourrin et afficher direcetement ton code (bien plus rapide que de saisir un rapide descriptif donné a ta macro, le dévellopeur moyen se souvient de ce qu'il a écrit).
    # define debug(CODE, ...) fprintf(stderr,"%s::%s, line %i : ",\
     __FILE__, __FUNCTION__, __LINE__);\
     fprintf(stderr, "\"%s\" - ", #CODE);\
     fprintf(stderr, __VA_ARGS__);\
     CODE
     
    Exemple : debug(appelFonction(param), "param : %s", param); te donnera comme sortie a l'exécution :
    main.c::mafonction, line 23 : "appelFonction(param)" - param : valparam
     
    après tu peux faire des truc sympa comme du avant/après :
    # define debug(CODE, ...) fprintf(stderr,"%s::%s, line %i : ",\
     __FILE__, __FUNCTION__, __LINE__);\
     fprintf (stderr, "\nbefore : ");\
     fprintf(stderr, __VA_ARGS__);\
     CODE;\
     fprintf (stderr, "\nafter : ");\
     fprintf(stderr, __VA_ARGS__)
     
    et bien sûr tu peux toujours faire:
    #if defined (DEBUG)
    # define debug(CODE, ...) fprintf(stderr,"%s::%s, line %i : ",\
     __FILE__, __FUNCTION__, __LINE__);\
     fprintf (stderr, "\nbefore : ");\
     fprintf(stderr, __VA_ARGS__);\
     CODE;\
     fprintf (stderr, "\nafter : ");\
     fprintf(stderr, __VA_ARGS__)
    #else
    # define debug(CODE, ...) CODE
    #endif
     
    Bon après y'a moyen de se faire haïr par tout les relecteurs, donc bien penser a tout nettoyer :)