begin process at 2008 07 06 13:02:24
1 205 544 membres
121 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SUREVEILLER LES ALLOCATIONS DE MEMOIRE [C]


Information sur la source

Catégorie :Divers Classé sous : surveiller, mémoire, allocations Niveau : Initié Date de création : 02/07/2005 Date de mise à jour : 03/07/2005 17:35:16 Vu / téléchargé: 3 151 / 373

Note :
Aucune note

Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

Description

Cette source surveille la memoire utilisée votre appli (c.f. titre).

Pour l'utiliser :
- rajouter mwatch.c et mwatch.h à votre projet
- inclure "mwatch.h" dans tous les fichiers qui peuvent potentiellement allouer (ou desallouer) de la mémoire
- appeler mw_Init("nom_du_fichier_log_mémoire_que_vous_voulez"); au debut du prog
- appeler mw_Shutdown(); à la fin du prog
- recompiler tout le projet

Vous pouvez aussi appeler à n'importe quel moment (entre mw_Init et mw_Shutdown) la fonction mw_Stats(); qui rapelle le total des allocations et le total des allocations depuis le dernier appel à mw_Stats.

Le fichier test.c n'est qu'un fichier de test pour vérifier si ca marche. Vous pouvez aller voir dedans pour avoir un exemple d'utilisation du memory watch.
Le fichier mwatch_log.txt est ce que vous devez normalement obtenir avec test.c

Conclusion

J'espere que cette source sera utile à tous ceux qui ont un jour rencontré un memory leak.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

03 juillet 2005 17:35:16 :
Mise à jour: - ajout du test NDEBUG - support de la fonction realloc()
  • signaler à un administrateur
    Commentaire de remi1203 le 02/07/2005 18:11:01

    N'hésitez pas à laisser des commentaires ou des remarques !

  • signaler à un administrateur
    Commentaire de Nebula le 02/07/2005 19:07:30

    Une petite remarque en passant : il serait judicieux de prendre en compte une constante comme NDEBUG (très utilisée sous Visual C++) afin de ne pas inclure le code de vérification dans les programmes finaux, ainsi par exemple :

    #ifndef NDEBUG

    /* exécutable debug : installer le hook */

    #define malloc(size) mwatch_malloc(size, __FILE__, __LINE__)
    #define free(ptr) mwatch_free(ptr, __FILE__, __LINE__)

    #else

    /* rien : malloc et free sont déjà définies, normalement */

    #endif

  • signaler à un administrateur
    Commentaire de Thaeron le 02/07/2005 21:42:08

    C'est pas mal comme idée, mais ça seg fault lors d'un realloc ...

  • signaler à un administrateur
    Commentaire de Thaeron le 02/07/2005 21:54:47

    Je viens de regarder comment tu avais procédé pour connaître la taille qui est free. Je trouve ta méthode géniale, bravo.

  • signaler à un administrateur
    Commentaire de remi1203 le 03/07/2005 02:26:16

    tout d'abord, merci pour vos commentaires !!!

    nebula > oui, en fait j'y ai pensé mais je n'ai pas mis le test tout simplement paske je connaissais pas le nom du define. enfin merci qd meme !

    thaeron > merci beaucoup pour la remarque ! le realloc c normal il n'est pas implémenté.

  • signaler à un administrateur
    Commentaire de remi1203 le 03/07/2005 17:36:30

    Voila ca y est g fais une MAJ avec vos remarques. Si vous en avez d'autre, n'hésitez pas !

  • signaler à un administrateur
    Commentaire de Xs le 05/07/2005 22:13:07

    Il y a un truc que j'ai pas bien saisie : tu redéfinie "malloc" via un #define par ta fonction. Et dans celle-ci, tu utilises malloc ?! Pourquoi le compilo ne dit rien ? Il devrait entrer dans une boucle récursive infinie, non ?

    Je me rappelle que dans notre jeu WaterBall (dispo ici), nous avions dû utiliser les Heap pour allouer la mémoire nécessaire dans nos redéfinitions de new/delete/malloc....

  • signaler à un administrateur
    Commentaire de Clem le 06/07/2005 11:28:03

    j'ai pas testé mais regardé le code, et non malloc n'est pas redéfinit du tout, le seul fichier ou le vrai malloc doit être déjà définit c'est mwatch.c, les autres il ne le sera pas, et donc on peut utiliser les noms malloc, realloc, free, sans problèmes, ce qui justement permet d'insérer un code déjà fait et prévu avec malloc, sans avoir à renomer les malloc en mwatch_malloc.
    l'avantage ici c'est qu'il utilise du C et non du C++ (beaucoup de personnes préfères le C au C++, la dessus chacun son avis en fonction des besoin en C/C++ que l'on a), c'est donc compatible avec les deux C, et ici si on ne vérifie pas le heap par les api win32 (aucune api win 32 d'ailleurs si je me trompe, donc compatible unix et linux ?), le heap sera lui même vérifié simplement par le vrai malloc.
    En fait les fonctions malloc définies par remi sont une sorte de proxy au malloc, qui va réclamer 4 bits de plus que ceux que l'on demande (sizeof(int)=4) et on va donc stocker dans ces 4 bits, la taille de la mémoire définie, ce qui permet donc de la soustraire lors du l'utilisation de free, je doit avouer c'est très ingénieux^^

  • signaler à un administrateur
    Commentaire de Clem le 06/07/2005 11:28:55

    erf cppfrance à déconner (et je continue de flooder :p)

  • signaler à un administrateur
    Commentaire de Clem le 06/07/2005 11:33:13

    je vais encore flooder, mais je vient de voir que tu utilise des int, bon je sais qu'il n'y à pas vraiment de danger, je voit mal quelqu'un alouer plus de 2 Go de ram mais c'est toujours plus propre d'utiliser des size_t ou au moins des unsigned int ;)

  • signaler à un administrateur
    Commentaire de Thaeron le 06/07/2005 12:48:48

    Je suis sous GNU/Linux et effectivement ça marche, enfin j'émet quand même une petite réserve car sous GNU/Linux j'utilise souvent le debugging hook de malloc (en faisant export MALLOC_CHECK_=1) or sur mon programme je n'ai aucun message d'erreur mais lorsque j'utilise mwatch à certains moments j'ai "invalid pointer" et ça fini en "segmentation fault", j'ai beau regarder son code tout semble correct donc je ne sais pas d'où provient ces erreurs.
    Clem un int n'est pas 4 bits mais 32 bits soit 4 octets.

  • signaler à un administrateur
    Commentaire de remi1203 le 06/07/2005 14:23:48

    clem > "je doit avouer c'est très ingénieux^^" MERCI bcp

    thaeron > g pas UNIX/Linux mais tu peux m'envoyer ton code pr essayer de trouver le truc qui bug ?

  • signaler à un administrateur
    Commentaire de Thaeron le 06/07/2005 14:43:00

    Heu je veux bien mais il fait plus de 10 000 lignes de code =X mais je pense que le probleme vient du fait qu'il utilise des modules ("équivalent" des dlls) dans lesquels je n'ai pas mis mwatch, cependant je ne suis pas sur que ça expliquerait les premiers pointeurs invalides.
    Je regarderai tout ça plus en détail.
    Clem a raison ton système est très ingénieux (je sais je l'ai déjà dis mais bon).

  • signaler à un administrateur
    Commentaire de remi1203 le 06/07/2005 23:31:39

    thaeron > ben en fait ca doit planter si tu fait un malloc (pas mwatch) avec le free correspondant qui lui est mwatch.
    par contre ca doit marcher si tu fais un malloc mwatch suivi d'un free normal (mais la t'as un memory leak de la taille d'un entier a chaque fois que tu fais une allocation)

  • signaler à un administrateur
    Commentaire de forest2 le 07/11/2005 18:07:52

    salut tu sais c'est tres interssant comme approche
    mais est il possible de alloue la memoire d'un tableau  

  • signaler à un administrateur
    Commentaire de forest2 le 07/11/2005 18:15:08

    c'est toujours moi vous savez je programme sous linux et je faire un apple recursiive qui modifie une valeur d'un tableux de vecteur mais il pas initialise donc comment faire merci....  

  • signaler à un administrateur
    Commentaire de remi1203 le 08/11/2005 00:28:19

    Salut forest2,

    Pour les allocations/desallocations ca marche exactement comme d'habitude (donc normalement avec les tableaux aussi). La seule chose à surveiller est que tu dois faire un malloc mwatch et un free mwatch (faut pas croiser avec des malloc et free pas mwatch).

    Pour ton tableau de vecteur j'ai pas très bien compris le problème mais normalement tu fais comme d'habitude avec malloc() et free() et ca marche.

  • signaler à un administrateur
    Commentaire de hedonypower le 21/12/2006 15:15:33

    Chouette idée !
    Mais cela ne semble pas fonctionner avec les new et les delete en C++ non ?
    Y'a t-il un moyen de l'adapter pour les new et delete ?

    Merci :-)

    Olivier

Ajouter un commentaire

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS