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 673 / 391

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.

 

Fichier Zip

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

Historique

03 juillet 2005 17:35:16 :
Mise à jour: - ajout du test NDEBUG - support de la fonction realloc()

Commentaires et avis

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

Discussions en rapport avec ce code source dans le forum

Pointeur qui fait planter Windows !!! [ par coyito ] Salutquand je défini moi même une addresse pour un pointeur (exemple pour lire n'importe ou dans la mémoire) j'ai une erreur windows "access violation Segmenter un fichier en mémoire C (seulement) [ par golum ] Voila pour ouvrir a partir de mon prog c un fichier de 20 Mo je met 1min et j'aimerais a tout pris diminuer ce temps.Est-il possible de segmenter le f plusieur fenetre mais une seule en mémoire... [ par Xs ] Bon, voila.Quand je fais une nouvelle fenetre avec un code ressemblant a ca : hwnd = CreateDialog(...);ShowWindow(hwnd,SW_SHOW);......bon, et bien il pb mémoire [ par MELISA ] Bonjour à tous,Voici mon pb: lorsque j'exécute mon projet, à un moment donné l'erreur suivante s'affiche: "L'instruction à "0x5f41194f" emploie l'adre Mémoire partgé [ par Sade ] Salut tous le monde,Je souhaiterai partger un espace mémoire (la même adresse), entre plusieur programme distinct fonctionnent sur le même PC.comment pb de pointeur sur la mémoire de la carte vidéo [ par NeoFab ] Salut à tous!J'étudie en ce moment la programmation en C sous Turbo c++ pour faire du graphisme, en écrivant directement dans la mémoire de la carte v Codage du JPEG en mémoire [ par Subarufr ] Je réalise comme projet d'informatique un prgm de stéganographi (cryptage par l'image) j'aimerais donc savoir comment un codé un fichier JPEG en mémoi erreur "ne peut etre un read" [ par Sade ] Salut a tous le monde.Dans le programme que j'ai develoP, j'utilise le FileMapping pour pouvoir echange des données entre deux programme distinct fonc Macro assembleur pour microcontroleur [ par Tyozhebes ] Bonjour à tous ! Je suis actuellement sur la programmation d'un 68HC11 et, pour des raisons de mémoire (seulement 2ko), il me faut le programmer en Mémoire partagée et pointeur [ par darsh99 ] Bonjour,J'essai de faire passer un tableau dynamique, un pointeur donc, d'un programme à un autre, l'adresse est bien passée et les champs non dynamiq


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,920 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.