BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024
-
3 févr. 2010 à 10:42
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023
-
8 févr. 2010 à 17:34
Chers amis bonjour!
J'ai un code assez conséquent qui contient potentiellement des fuites mémoire.
J'aimerais mettre en place un outil de suivi d'allocation de mémoires afin de tracer les éventuelles fuites.
Je pensais redéfinir les opérateurs new et delete afin de tracer les allocations (pointeur, taille, fichier, ligne).
Est-ce faisable rapidement? Avez-vous ce genre d'outil sous la main?
@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 3 févr. 2010 à 12:21
Tu vas redéfinir les opérateurs new et delete de chaque classe ? Un peu lourd non ?
Sous Unix, il y a un outil super pour ça: valgrind. Il détecte les fuites mémoires (et d'autre chose comme les débordements de bornes, les doubles désallocations, etc...), et peut même parfois détecter la ligne exact dans le code.
Il existe sûrement un équivalent Windows, non ?
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 3 févr. 2010 à 14:31
L'idée est justement de modifier au minimum le code: c'est pour ça que je veux redéfinir les opérateurs.
Je ne connais pas valgrind mais des recherches m'ont montré que l'équivalent sous Windows était Purify. Or il est tellement gourmand en ressource que je peux pas le faire tourner correctement en même temps que mon appli...
@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 3 févr. 2010 à 14:39
Est-ce que ton appli est multi-plateforme ? Si c'est le cas, je peux toujours te faire tourner un coup de valgrind :)
Peux-tu essayer sinon de redéfinir les appels system aux allocations mémoires ? Par exemple le projet Duma (ex Electric Fence), par un simple binding, permet de faire cela. Il check alors certains accès mémoires invalides. Tu peux peut être réutiliser leur technique pour détecter des fuites mémoires sans intrusion dans ton code. En revanche, ce n'est pas trivial.
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 8 févr. 2010 à 16:03
Re,
J'ai réussi à redéfinir mes new et delete dans une dll. Il me suffit d'inclure ma dll dans mon projet et, en sortie, j'ai un log avec les fuites détectées (fichier, ligne, taille d'alloc).
ça marche bien sur de "petits" projets". Par contre, sur des plus gros incluant d'autres ressources tierces, il peut y avoir des soucis: par exemple, Xerces redéfinit lui aussi les opérateurs new et delete. Du coup, mon projet ne compile plus (syntax error dans XMemory.hpp).
Des idées pour faciliter la cohabitation?
@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 8 févr. 2010 à 17:07
Essaie d'utiliser un vrai outil de vérification mémoire. La redéfinition des operateurs new et delete ne garantie pas que tu trouves toutes les fuites (ils n'agissent pas sur les malloc/free, et les new/delete custom).
De plus, il faut aussi redéfinir delete[].