Connexion
Vous n'avez pas encore de compte personnel ? Vous devriez en créer un. Une fois enregistré vous aurez certains avantages, comme pouvoir modifier l'aspect du site, ou poster des commentaires signés...
Support
Activité du Site

Pages vues depuis 06/01/2019 : 13 117 201

  • Nb. de membres 367
  • Nb. d'articles 2 845
  • Nb. de forums 24
  • Nb. de sujets 13
  • Nb. de critiques 0

Top 10  Statistiques

Index du forum »»  Développement »» [Résolu] - Problème de mémoire à la destruction d'objets C++

[Résolu] - Problème de mémoire à la destruction d'objets C++#499

3Contributeur(s)
rmais96FabYomgui
2 Modérateur(s)
PapiosaurBeWorld
rmais96 rmais96icon_post
Je rencontre un problème récurrent avec un programme écrit en C++ et compilé avec Gcc
(2.95.3 et 4.0.4). L'application provoque des erreurs du type :

TLSF_FreeMem: ptr 0x2a3eb500 wrong size 34 (memory was allocated for 4294967281-0 bytes)

J'ai consulté le dump de l'application et le problème se produire dans les destructeurs
des objets ou dans les routines de destruction internes et propres à Gcc (__builtin_delete).
Bref au moment de la libération de mémoire.

Je ne sais pas comment trouver la cause du problème qui survient rarement deux fois au même
endroit. Est-ce le résultat d'un jardinage en mémoire ? Comment trouver la cause d'un tel
problème sans un debugger pour consulter les objets présents en mémoire autour de celle qui
semble altérée ?

Si vous avez des idées je suis preneur.
Fab Fabicon_post
Un outil style wipeout pourrait aider (je peux t'envoyer si besoin est, via irc). Ceci dit, ton problème ressemble fortement à un double delete.
rmais96 rmais96icon_post
Je vais instrumenter le code pour voir si je peux mettre en évidence des doubles destructions.
C'est quoi wipeout exactement (mise à part un jeu de courses en 3D) ?
Fab Fabicon_post
Wipeout surveille les allocs et met en place des motifs et tout pour détecter d'éventuels trash (tout ça rend évidemment le système assez lent, mais ça reste pratique parfois).
Yomgui Yomguiicon_post
Asser lent est un euphémisme... genre j'évite avec blender, sinon c'est: un click... j'attend 1 minute.. un autre click... oups! j'ai bougé la souris... j'attend 5 minutes!

:-)

En tout cas, wipeout va te montrer immédiatement les sur-déallocations inutiles, ensuite cela sera forcement du jardinage de mémoire.
--

http://blog.yomgui.fr/
http://www.yomgui.fr/yiki/doku.php
http://www.yomgui.fr/bugtracker
rmais96 rmais96icon_post
Citation : Fab 

Wipeout surveille les allocs et met en place des motifs et tout pour détecter d'éventuels trash (tout ça rend évidemment le système assez lent, mais ça reste pratique parfois).
 

Problème résolu avec Wipeout (dispo sur aminet). Il s'agissait d'un cast malheureux d'un objet en une classe fille.
Yomgui Yomguiicon_post
Autre utilitée rapide avec wipeout: la perte de mémoire.

Exemple: mon port de python bouffe 24 octets à chaque lancement. Comment je l'ai vu?
Lancer wipeout normalement (sans un RUN) dans un shell et ouvrir la console serie pour le debug.

- Faire un CTRL-C dans la console shell exécutant wipeout => cela donne l'état des allocations, simple et par pools.
- Notez les chiffres donnés.
- Dans un autre shell lancer python, juste avec l'option --version cela suffit, même pas la peine d'entrer dans l'interpréteur.
- Refaire un CTRL-C dans la console shell de wipeout et comparez de nouveau les chiffres.

=> vous aller voir une différence d'une allocation simple et 24 octets en plus.

\me qui doit un jour corriger ce pb... mais bon 24 octets c'est pas la mort :-D
--

http://blog.yomgui.fr/
http://www.yomgui.fr/yiki/doku.php
http://www.yomgui.fr/bugtracker