begin process at 2010 02 10 12:57:12
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > SUREVEILLER LES ALLOCATIONS DE MEMOIRE [C]

SUREVEILLER LES ALLOCATIONS DE MEMOIRE [C]


 Information sur la source

Note :
Aucune note
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 946 / 396

Auteur : remi1203

Ecrire un message privé
Site perso
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_voule z"); 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

Les Membres Club peuvent 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()

 Sources de la même categorie

Source avec Zip CALLOCATOR par troctsch
Source avec Zip HEAPCOLLECTOR par troctsch
Source avec Zip GÉNÉRE UN TABLEAU DE CARACTÉRE AU FORMAT C CONTENANT LE BYTE... par kertimanoff
FRACTIONS EGYPTIENNES par lptm974
BITOPERATOR par FrancoisGauthier

 Sources en rapport avec celle ci

[DEV-C++] CALCUL DE LA RACINE CARRÉE D'UN RÉEL par Jhep
PROCESS DUMPER par lilxam7
Source avec Zip LIBRAIRIE POUR ÉVITER LES FUITES MEMOIRES par glipper
MODIFIER UN PROCESSUS EN MÉMOIRE par lilxam
GESTION DE LE MÉMOIRE UTILISÉE PAR UN PROCESSUS par lilxam

Commentaires et avis

Commentaire de remi1203 le 02/07/2005 18:11:01

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

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

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 ...

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.

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é.

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 !

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....

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^^

Commentaire de Clem le 06/07/2005 11:28:55

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

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 ;)

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.

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 ?

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).

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)

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  

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....  

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.

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...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales