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

Langage C++ Discussion :

Tracer les constructions/destructions d'instance


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut Tracer les constructions/destructions d'instance
    Bonsoir,

    j'ai créé un compteur d'instance qui s'incrémente à chaque construction et chaque destruction de mes objets. Cela me permet de savoir si je construis des objets sans les détruire.

    Le problème est que, dans le cas où je n'aurais pas tout détruit, je ne sais pas localiser les constructions. J'aimerais savoir s'il existe une manière simple de gérer ce genre de choses.
    J'ai vu que "_LINE_" permet de récupérer les lignes de code, mais comment faire pour connaître les noms des méthodes?

    Merci pour votre aide

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 19
    Par défaut
    Il ne s'agit que d'une réponse partiel, mais j'avais déjà été confronté à ce problème. A mon avis il faut chercher du coté des pointeur intéligent et donc surcharger les méthodes new et delete.
    Malheureusement je n'ai jamais eu le temps d'approfondir ca :p

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Il n'y a pas de moyen simple. En effet, même si tu ajoutes un __LINE__ dans ton constructeur, il va te donner la ligne correspondante dans ton constructeur, et non pas dans le code appelant ton constructeur, ce qui sera peu utile... Il faut donc pour ça utiliser des fonctions (non standard) qui étudient la pile d'appels de fonction.

    Mais il y a d'autres solutions. Déjà, comme l'a dit Fylen, un gestion plus robuste de la mémoire, à base de pointeurs intelligents, permet de limiter les problèmes à la source.

    Ensuite, des outils, gratuits ou payants, spécialisés existent pour justement effectuer le genre d'instrumentation que tu as en tête, sans modifier ton code source.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Invité de passage
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 1
    Par défaut
    Si tu veux voir quel bout de code appelle ton constructeur, il y a la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __builtin_return_address(0)
    que tu devra placer dans le constructeur
    ( voir la doc: http://gcc.gnu.org/onlinedocs/gcc-4....Return-Address )

    En fait cette fonction retourne l'adresse de retour de la fonction courante (donc pointe l'instruction qui sera exécuté à la sortie de la fonction courante, cette instruction se situe donc juste après l'instruction qui a appellé la fonction). Sur certaines architectures tu peux utiliser un argument différent de 0, par example 1 retournera l'adresse de retour de la fonction appelante, etc.

    Donc tel quel c'est inexploitable, mais avec l'utilitaire addr2line (disponible dans la suite gcc) tu peux convertir l'adresse et récupérer le nom du fichier source, la fonction et la ligne de code correspondante à condition que tu es une version de ton binaire compilé avec le flag de debug -g (le cas échéant tu aura seulement le nom de la fonction):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    addr2line -f -e [tonBinaire] [tonAdresse]
    Donc grosso modo, tu fais un printf( [adresseDeRetour] ) (doit être sous forme hexadécimal pour addr2line) dans ton constructeur, et pendant ou après l'exécution sur une console tu tapes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    addr2line  -f -e [tonBinaire] [addresse1] [addresse2] etc...
    Pour récupérer les emplacements des différents appels vers ton constructeurs

  5. #5
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Bonjour et merci pour vos réponses.

    Si tu veux voir quel bout de code appelle ton constructeur, il y a la fonction:
    Code :
    __builtin_return_address(0)
    C'est vraiment intéressant, je ne connaissais pas du tout! Je vais regarder cela plus en détails et voir si je peux utiliser des fonctions système pour traiter tout cela hors console.

    Pour les pointeurs intelligents, mon niveau ne me permet pas encore de savoir les exploiter efficacement mais je vais me pencher sérieusement dessus.

    Ensuite, des outils, gratuits ou payants, spécialisés existent pour justement effectuer le genre d'instrumentation que tu as en tête, sans modifier ton code source.
    Aurais-tu un exemple d'outil gratuit Loic (voir open source histoire que j'aille voir un peu comment c'est fait)?

    Encore merci!

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Aurais-tu un exemple d'outil gratuit Loic (voir open source histoire que j'aille voir un peu comment c'est fait)?
    Je ne connais pas ta plateforme, donc c'est difficile à dire. Sous windows, Visual C++ intègre (peut-être pas dans sa version express) un outil de ce genre, assez basique.

    Valgrind est je pense le plus connu plus connu en free/GNU. Quand j'avais regardé, il y a 7 ans environ, son interface était assez rudimentaire.

    Autrement, en payant, il y a Intel Parallel Studio dont un module fait ça, ou BoundsChecker (mais j'ai peur qu'ils n'aient abandonnée le C++ pour ne plus faire que du .NET).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Citation Envoyé par julien9 Voir le message
    Si tu veux voir quel bout de code appelle ton constructeur, il y a la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __builtin_return_address(0)
    que tu devra placer dans le constructeur
    ( voir la doc: http://gcc.gnu.org/onlinedocs/gcc-4....Return-Address )
    Le soucis c'est que c'est spécifique à gcc. Avec un autre compilateur ça a des chances de ne pas exister ou d'avoir un nom différent.


    Sinon, il me semble que le tuto de Laurent Gomilla parle d'un gestionnaire de mémoire.

    Sur les outils dynamiques de vérification de la mémoire, j'en suis resté à ce qu'ils sont payants sous Windows (boundchecker, purify, insure++, etc.).

  8. #8
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Bonjour,

    Sinon, il me semble que le tuto de Laurent Gomilla parle d'un gestionnaire de mémoire.
    Merci, c'est exactement ce qu'il me faut!
    Cela va me permettre de démarrer et d'éviter les solutions non portables.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tracer les requêtes SQL
    Par izioto dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 13/10/2005, 16h35
  2. [Classe] Auto destruction d'instances
    Par Clorish dans le forum Langage
    Réponses: 7
    Dernier message: 11/07/2005, 14h52
  3. Conditions de destruction des instances de classes
    Par elvivo dans le forum Général Python
    Réponses: 4
    Dernier message: 29/12/2004, 17h16
  4. tracer les connexions web sur un serveur
    Par lutin511 dans le forum Développement
    Réponses: 2
    Dernier message: 28/06/2004, 23h36

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