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 :

Analyseur de mémoire consommé par un soft


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 50
    Points : 26
    Points
    26
    Par défaut Analyseur de mémoire consommé par un soft
    Bonjour j'ai développé un logiciel avec Visual C++; et j'aimerais avoir des statistiques sur la mémoire utilisée, consommé, perdue.

    Existe-t-il des logiciels permettant de voir la mémoire perdue par le logiciel?
    Style des new sans faire de delete, ...

    Ces logiciels permettent-ils de retrouver où on a pas libérer la mémoire?


    Merci d'avance pour votre aide...

    Chris.

  2. #2
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    Dans la liste des outils de ce site il y avait un petit programme qui a l'air de bien fonctionner : MemProof, dispo ICI

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Crisanar
    Dans la liste des outils de ce site il y avait un petit programme qui a l'air de bien fonctionner : MemProof, dispo ICI
    J'ai fait le programme suivant pour tester MemProof :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    void fuite_memoire()
    {
    	int *c = new int;
    }
     
     
    int main (int argc, char *arv[])
    {
     
    	for(int i = 0; i < 100; i++)
    	{
    		fuite_memoire();
    	}
     
    	return 1;
    }
    Je ne vois pas dans MemProof où il faut que je cliques pour qu'il me dise que la mémoire utilisée par la variable c de type int dans la fonction fuite_memoire n'est jamais libérée.

    Quelqu'un peut m'aider?

    Merci d'avance...

    Chris.

  4. #4
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Il existe plusieurs façons de gérer les fuites de mémoire, et il existe aussi des outils (parfois payants).

    - Surcharge de l'opérateur new. Ici un exemple: http://loulou.developpez.com/tutorie...eur3d/partie1/
    (attention il y a un bug si on utilise des variables globales).

    - Utiliser une classe personnalisée qui compte le nombre d'allocation et de désallocation. Si à la fin la différence des deux != 0 alors fuite).

    -Les outils: si tu utilies VC++, tu peux te servir de "DumpMemoryLeaks". Pour les payants j'ai pas encore testé.
    Ici: http://www.developpez.com/c/memoire/

    PS: toujours penser à regarder dans les FAQ de ce site.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    DumpMemoryLeaks ???

    Où je trouve ça?

    Comment je m'en sers?

  6. #6
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Les mots clés ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    #define _CRTDBG_MAP_ALLOC
    #include <stdlib.h>
    #include <crtdbg.h>
     
    _CrtDumpMemoryLeaks();
    Les explications ici:

    http://msdn.microsoft.com/library/de...emoryleaks.asp

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    J'ai fait ce que tu as dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #define _CRTDBG_MAP_ALLOC
    #include <stdlib.h>
    #include <crtdbg.h>
     
    void fuite_memoire()
    {
    	int *c = new int;
    	*c = 0x89ABCDEF;
    }
     
     
    int main (int argc, char *arv[])
    {
     
    	for(int i = 0; i < 5; i++)
    	{
    		fuite_memoire();
    	}
     
    	_CrtDumpMemoryLeaks();
     
    	return 1;
    }
    Le résultat de l'exécution donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    d:\softs\microsoft visual studio\vc98\include\crtdbg.h(552) : {45} normal block at 0x00431DA0, 4 bytes long.
     Data: <    > EF CD AB 89 
    d:\softs\microsoft visual studio\vc98\include\crtdbg.h(552) : {44} normal block at 0x00431DD0, 4 bytes long.
     Data: <    > EF CD AB 89 
    d:\softs\microsoft visual studio\vc98\include\crtdbg.h(552) : {43} normal block at 0x00431E00, 4 bytes long.
     Data: <    > EF CD AB 89 
    d:\softs\microsoft visual studio\vc98\include\crtdbg.h(552) : {42} normal block at 0x00430030, 4 bytes long.
     Data: <    > EF CD AB 89 
    d:\softs\microsoft visual studio\vc98\include\crtdbg.h(552) : {41} normal block at 0x00430060, 4 bytes long.
     Data: <    > EF CD AB 89
    Ainsi, je vois bien qu'il y a 5 blocks non libérés, mais comment savoir exactement d'où ça vient???
    J'aimerais bien qu'il me dise que ça vient de l'objet c qui se trouve dans la fonction fuite_memoire!!!
    Vous savez comment faire?


    Merci d'avance...

    Chris.

  8. #8
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Le problème c'est que "_CrtDumpMemoryLeaks();" ne te donnera l'emplacement concerné que pour le cas d'une allocation avec "malloc" et encore pour un projet qui ne contient qu'un fichier unique. Si tu utilises plusieurs sources, alors tu dois inclure ceci au tout début:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    Pour les allocations avec l'opérateur new, si tu doubles-click sur la ligne concerné tu es renvoyé dans le fichier "crtdbg.h". Tu as une solution ici:

    http://www.codeproject.com/debug/consoleleak.asp.

    Personnellement j'utilise cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    _CrtSetBreakAlloc(41);
    _CrtSetBreakAlloc(42);
    _CrtSetBreakAlloc(43);
    _CrtSetBreakAlloc(44);
    _CrtSetBreakAlloc(45);
    Comme tu peux le voir, les nombres 41, 42, 43, 44, 45, correspondent au résultat de _CrtDumpMemoryLeaks(); que tu as obtenu. Tu places ce code en tout début de programme avant toute allocation et le débuggeur s'arrêtera à chaque allocation. En regardant la pile d'appel, tu trouves assez facilement de quel allocation il s'agit. Attention, il ne faut pas modifier le code source entre temps car les nombres pourraient ne plus correspondre.

    Il y a d'autres méthodes, par exemple en faisant une différences des états d'allocations dans une portion de code. Je te renvoie à la documentation. pour tout ça.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Novembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Et MemProof peut faire des trucs comme ça?

  10. #10
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Oui, mais ça à plutôt l'air dédié à delphi et borland.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Novembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Et tu connais pas un soft qui le fait, sans devoir toucher au code?

  12. #12
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Je cherche aussi un programme qui puisse surveiller toute les alocation/désalocations mémoir d'un processuse, de préférence sans avoir a modifier le code, sans avoir besoin de rajouter quelque chose a la compilation. Je suis donc aussi intérèsser par la réponsse, a la diférence que je n'utilise pas VisualC++.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  13. #13
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    J'ai téléchargé AQTime. Il y a une version d'évaluation de quelques jours.

    J'ai pas encore eu le temps de tester. Mais apparemment, il permet de faire ce genre de test sans modifier grand chose dans le code.

    Je préfère une gestion manuelle pour ce genre de vérification, mais si je trouve des softs performants alors pourquoi pas.

    Il en existe d'autres (confère le lien que j'ai donné plus haut qui se trouve sur ce site).

  14. #14
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Citation Envoyé par chris_wafer_2001
    Et tu connais pas un soft qui le fait, sans devoir toucher au code?
    En fait sans toucher au code juste en surveillant l'exe, je pense qu'il ne faut pas trop rêver.

    La seule chose que tu peux surveiller, je pense, c'est l'évolution de la mémoire utilisée (confère le gestionnaire de tâche sous win).

    Tu lances ton soft: mémoire utilisée = 6300ko par exemple.

    Au bout de deux jours: mémoire utilisée = 85500ko par exemple, ben là y a problème.

  15. #15
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    Un hook de certaines d'APIs bien spécifiques (VirtualAlloc, HeapAlloc,...) ne peut pas faire ce travail 'proprement'?

  16. #16
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Citation Envoyé par Crisanar
    Un hook de certaines d'APIs bien spécifiques (VirtualAlloc, HeapAlloc,...) ne peut pas faire ce travail 'proprement'?
    Oui effectivement. D'ailleurs peut-être que certains softs utilisent ce procédé.

  17. #17
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Crisanar
    Un hook de certaines d'APIs bien spécifiques (VirtualAlloc, HeapAlloc,...) ne peut pas faire ce travail 'proprement'?
    Non, parce qu'à priori ces fonctions ne sont pas utilisées directement dans son soft, mais indirectement par new/malloc. Ainsi, pour un seul HeapAlloc, il y a peut être 20 new d'effectués (le new rajoute sa gestion de la mémoire par dessus celle de Windows).
    La CRT de VC++ permet de détecter les fuites (_CrtDumpMemoryLeaks...), ainsi que de poser un breakpoint sur un numéro d'allocation. Ainsi, après avoir appris que l'allocation numéro 41 n'est pas libérée, réexécute ton logiciel exactement de la même manière en donnant le numéro 41 à _CrtSetBreakAlloc. Lorsque cette allocation aura lieu, hop le debugger arrêtera le process et tu pourras localiser l'allocation.
    Par le code c'est pénible à faire car faut recompiler. Tu peux le faire depuis le débogueur:
    http://support.microsoft.com/kb/151585/en-us
    et apparement y'a eu un super travail de fait ici:
    http://www.codeproject.com/tools/visualleakdetector.asp
    apparement, car quand j'ai voulu testé le téléchargement depuis le site ne fonctionnait pas, du coup je me suis fait ma petite lib.

  18. #18
    Nouveau membre du Club
    Inscrit en
    Novembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    J'ai découvert le logiciel :
    BoundsChecker

    Il s'intègre notamment à Visual C++; et permet de recompiler en instrumentatnt le code.
    Les fuites de mémoire sont détectés, et on a juste à cliquer pour atterir sur le code provoquant la fuite mémoire!!!

    GENIAL et ENORME!!!

    Malheureusement, le logiciel est payant, mais ça vaut le coup car les résultats sont impressionnants.

    Plus d'infos sur le lien suivant : http://www.compuware.com/products/devpartner/bounds.htm

    Chris.

  19. #19
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Je ne l'ai jamais utilisé, mais il est souvent cité comme référence, avec purify (payant lui aussi).
    Sous Linux en gratuit il y a valgrind.

Discussions similaires

  1. Récupérer la quantité de mémoire utilisée par mon soft
    Par megamario dans le forum Embarqué
    Réponses: 6
    Dernier message: 21/03/2013, 10h37
  2. Libérer la mémoire consommée par un DataModule
    Par liviertlse dans le forum Bases de données
    Réponses: 16
    Dernier message: 10/05/2007, 14h59
  3. [mémoire consommée par Oracle]
    Par tesla dans le forum Oracle
    Réponses: 4
    Dernier message: 03/10/2006, 16h47
  4. Supprimer la mémoire utilisée par les variables globales
    Par dnaprotector dans le forum OpenGL
    Réponses: 4
    Dernier message: 21/07/2005, 13h18
  5. [JVM] Connaitre la taille mémoire utilisé par les dif classe
    Par sur_uix dans le forum Général Java
    Réponses: 4
    Dernier message: 18/09/2003, 09h17

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