IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Comment affichez vous vos trace pour debugger?


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut Comment affichez vous vos trace pour debugger?
    Bonjour,

    Lorsque je code; j'ai plus ou moins trois mode:
    debug
    release + trace (pour debugger la release )
    release (pour clients - la plus legere possible)

    Du coup dans le code (qui n'est pas tout de moi), je me trouve parfois avec:
    methode 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #ifdef __TRACE
    affiche( "Message pour debugger" )
    #endif
    methode 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifdef __TRACE
    #define affiche( x )  affiche(x)
    #else
    #define affiche( x )
    #endif
     
    // et dans le code
    affiche ( "Message pour debugger" )
    methode 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class trace{
    #ifdef __TRACE
      inline affiche(x) {affiche(x); };
    #else
      inline affiche(x) { };
    #endif
    }
     
    // Et dans mon code
    pTrace->affiche( "Message pour debugger" );
    Je trouve les deux premières methodes lourdes et je prefere la 3eme.
    Mais je me demandai, ma fonction affiche() utilise plus de parametre que dans l'exemple, du coup meme si je compile en release sans __TRACE, est-ce que la pile de paramètre ne va pas être intégré dans le code final?
    Le simple fait d'utiliser mon pointeur et de faire appel va generer du code, n'est-il pas?

    Enfin sinon comment faites vous vous ?

    Merci

  2. #2
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Ce type d'opérations ne serait-il pas mieux géré par des loggers comme log4cxx : http://logging.apache.org/log4cxx/index.html ?

    Ce type d'outils permet de diriger les flux de messages aisément, ou de ne pas les logger du tout en release par exemple.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    je suis plus du genre a utiliser un debugger quand il y'a un souci

    les traces que je laisse sont des traces applicatives (via un loggeur ou autre),

    Jamais des traces de debug que je nettois systématiquement un fois le problème corrigé.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par seriousme
    Ce type d'opérations ne serait-il pas mieux géré par des loggers comme log4cxx
    +1 (mais quand c'est pas fait des le debut...)

    Citation Envoyé par jabbounet
    je suis plus du genre a utiliser un debugger quand il y'a un souci
    ok et quand:
    - environnement multi-thread, le fait de se mettre en debug bloque le thread ce qui bloque les autres thread...
    - bug qui ne se produit que dans certaines conditions, une fois tout les mille ans...
    - bug qui se produit que chez un client, et que sur sa machine (a cause d'un driver video completement foireux (j'ai eu!!)) et je me vois mal installé un debugger chez le client!
    - ...

  5. #5
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    - environnement multi-thread, le fait de se mettre en debug bloque le thread ce qui bloque les autres thread...
    tu peux utiliser un debugger en multithread tu peux chopper ton appli au vol avec son pid, tu peux lui demmander de s'arreter quand elle rentre dans une methode particulière (apres si les autres threads continue leur vie et se crash pendant que tu debug ta methode c'est pas le souci tu te focalise sur la methode qui plante)


    bug qui ne se produit que dans certaines conditions, une fois tout les mille ans...
    si tu connais les conditions tu sais le reproduire

    bug qui se produit que chez un client, et que sur sa machine (a cause d'un driver video completement foireux (j'ai eu!!)) et je me vois mal installé un debugger chez le client!
    Si te traces applicatives sont suffisament bien faite tu sais par quel chemin est passé ton client pour produire le bug.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    [quote=jabounet]Si tes traces applicatives sont suffisamment bien faite tu sais par quel chemin est passé ton client pour produire le bug.[/trace]
    ok, je viens de comprendre un truc => trace applicative = trace tout le temps
    C'est ce genre de chose qu'on fait pas.
    En fait, dans nos appli on ne met les traces qu'en cas d'anomalie et on se retrouve sans le cheminement!

  7. #7
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par jabounet
    Si tes traces applicatives sont suffisamment bien faite tu sais par quel chemin est passé ton client pour produire le bug.
    ok, je viens de comprendre un truc => trace applicative = trace tout le temps
    C'est ce genre de chose qu'on fait pas.
    En fait, dans nos appli on ne met les traces qu'en cas d'anomalie et on se retrouve sans le cheminement!
    Non, on ne trace pas tout, tout le temps. C'est trop couteux en terme de perfs.
    tu as des niveaux de trace qui peuvent faire que ton appli est plus ou moins bavarde (INFO, WARNING, ERROR, FATAL, LOG), ce qui est tracé tout le temps ce sont les LOG et les FATAL, les autres peuvent être desactivés.

    Et quand ton client detecte un souci et que tu n'arrive pas a reproduire tu lui demande de relever temporairement sont niveau de traces.
    mais ce ne sont pas des traces de debug dans le sens ou elles respect un format bien précis et que ce n'est pas des printf("coucou je suis passé par là");
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    (INFO, WARNING, ERROR, FATAL, LOG)
    En fait j'ai dit une bêtise, on a bien un fonctionnement similaire, j'étais a l'ouest!
    C'est juste que des fois, j'aimerais bien tout tracer jusqu'au contenu des variables, mais la ça devient trop lourd niveau code, d'où le coup de ne l'afficher que dans certains cas.
    Mais bon je me rend compte en causant que mon principe de mettre des #ifdef __TRACE correspond juste a un level de plus finalement.

    ok ça m'a bien éclairci la tête!

    PS:
    Citation:
    bug qui ne se produit que dans certaines conditions, une fois tout les mille ans...
    si tu connais les conditions tu sais le reproduire
    Je pensai a des conditions encore inconnues

  9. #9
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Ceci dit il faut faire attention aux perf quand tu utilise un traceur car le passage de paramètres a un prix

    pour le cas java (choppé vite fait sur le net)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(logger.isDebugEnabled() {
       logger.debug("Entry number: " + i + " is " +
       String.valueOf(entry[i]));
    }
    est mieux que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    logger.debug("Entry number: " + i + " is " +
    String.valueOf(entry[i]));
    car dans le second cas même si le log debug n'est pas actif la chaine passé en paramètre est quand même évalué (ce qui peux couter cher).
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  10. #10
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par kacedda Voir le message
    Mais bon je me rend compte en causant que mon principe de mettre des #ifdef __TRACE correspond juste a un level de plus finalement.
    pas tout à fait fait car cela dépendra de la façon dont tu génère le binaire et non d'un paramètre de configuration de ton application/traceur
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  11. #11
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Comme ce problème est récurent, je me suis créé une petite bibliothèque de gestion des traces WinLog que j'utilise pour tous mes projets.

    Un seul problème (si c'est vraiment un problème ?), c'est orienté développement Microsoft
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Et est-ce que vous typez vos messages de log ? Info, warning, error ?

    Perso je propose une interface de log, qu'implémenterons différents logger (un vers un fichier, un vers la partie debug du compilateur etc.) permettant pour l'utilisateur de ce système, de pouvoir implémenter son propre logger afin d'afficher les messages dans une partie de son IHM par exemple, où enregistrer les erreurs en base, les envoyer sur un socket etc...

    Puis un point d'entrée, à qui on envoi les messages et dont le rôle est de les transmettre aux différents loggers "branchés".

    Cela permet, qu'en cours de développement, d'avoir continuellement les messages sous les yeux, sans devoir sans cesse checker les fichiers.

    Pour l'utilisation, je rajoute des opérateurs de flux, afin de ne pas laisser l'utilisateur du gestionnaire de log faire les conversions en chaînes.
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  13. #13
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Par experience, c'est toujours en release chez le client qu'on a besoin des traces

    Donc pas de #ifdef pour "virer" le code de logging
    Mais un vrai logging (j'aime pas trop log4cxx qui essaye de reproduire un log4j antédiluvient). On a une librairie interne pour ça, qui utilise un 'contexte' de thread pour savoir ou les choses doivent être loguées et quoi doit être logué au minimum, et des settings (à la log4xxxx) pour savoir quoi doit être logué par défaut. Tout est modifiable dynamiquement (par exemple "hooker" le debugguer microsoft rajoutera dynamiquement une sortie vers la fenetre de debug).

    Notre systeme combine donc:
    - Des "LogOutput" (file, e-mail, thread-history, debug-window)
    - Un contexte de thread (qui determine les LogOutput, leur niveau de log, et le niveau minimal de logging)
    - Un logger par 'module' (classe, module logique, ...) qui determine le niveau minimal de logging.
    - Les fonctions log vont utiliser le logger du module & le contexte, si le niveau dépasse l'un des deux, le log sera fait a travers les contexte.
    - Les levels suivants: "Trace", "Debug" (chemins d'executions), "Warning" (erreurs récupérables), "Info" (opérations atomiques), "Error" (erreurs inattendues nécessitant l'arret de l'opération en cours), "Fatal" (erreurs inattendues et mettant en péril l'application).

    Chez le client, on est par défaut en mode "info" (info, error, fatal sont les seuls 'levels' logués, parmi: trace, debug, warning, info, error) mais on peut passer des modules en mode debug, ou alors, des contextes entiers.... Même avec la release.
    Sans compter le systeme qui nous envoit un e-mail directement a chaque "fatal" avec un appercu des X derniers logs effectués par le thread.
    L'overhead est très faible, et la facilité d'analyse des bugs... accrue
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. Comment codez vous vos interfaces ?
    Par Dsphinx dans le forum AWT/Swing
    Réponses: 29
    Dernier message: 15/06/2006, 00h03
  2. [Info]Comment créez vous vos interfaces ?
    Par Le Pharaon dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 24/11/2005, 14h33
  3. Comment creez vous vos interfaces ?
    Par Regis.C dans le forum EDI et Outils pour Java
    Réponses: 28
    Dernier message: 21/10/2005, 16h47
  4. [MySQL] Comment ecrivez-vous vos traitements batch
    Par ouioui2000 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 21/10/2005, 15h36
  5. [tomcat][jsp] Comment gerez vous vos connexions bdd?
    Par olive.m dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 21/06/2004, 17h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo