Memory Leak sur le Tooltip dans une fenêtre MDI
Je ne parle pas souvent de sujet de ce type, me cantonnant la plupart du temps à des astuces liées à l’accès aux données ou à de la synchro, sujets que j’affectionne particulièrement, mais aujourd’hui je vais faire une exception pour vous parler d’un outil qui m’a permis de déceler un horrible bug dans le Framework.Net (Si si c’est rare, mais ça arrive, on est humain !)
Bon… bug certes, mais dans un cas tellement particulier ! Imaginez qu’il vous faut mettre en relation : Une fenêtre mère Parent, une fenêtre fille MDI et un User Control contenant un ToolTip. Oui, faut chercher loin (vous imaginez même pas)
Et bien sachez que le Tooltip génère un memory leak (fuite mémoire en français dans le texte) ! Celui ci gardant une référence sur la fenêtre mère (Cherchez pas pourquoi, moi j’ai tenté de trouver une explication rationnelle, et après je suis allez voir Avatar, j’ai laissé tomber l’affaire).
Pour en arriver à cette conclusion, je me suis d’abord arracher la moitié de la tignasse, j’ai sacrifié 4 pingouins et descendu une quantité non négligeable de férro rocher (merci Mag au passage !)
Ensuite j’ai commencé à faire le tour des outils de diagnostic de mémoire, et le moins qu’on puisse dire, c’est qu’il y a du lourd sur le marché.
Je me suis tourné vers une solution proposé par Red Gate : Memory Profiler
Le principe est assez simple : Vous prenez une photo étalon de votre application à un instant T, puis à un instant T+1 et vous comparez les résultats :

Vous pouvez même obtenir un graphe complet (graphe de rétention) représentant le chainage de votre instance en mémoire avec le GC qui l’empêche de collecter ^^
Grace à cet outil, j’ai pu remonter pas mal de soucis dans l’application que j’ai du auditer, et notamment ce fameux bug du ToolTip.
D’abord, à chaque “ouverture –fermeture” d’une fenêtre la mémoire n’était jamais libérer (même en forçant le Garbage Collector)
Le nombre d’instances en mémoire explosent très vite du coup :
Je note surtout la présence de ma fenêtre MDI, qui contient l’ensemble des autres composants. ah ah ! problème ici :)
Et comme on peut s’y attendre, j’ai bien 7 instances en mémoire, correspondant aux 7 “ouverture fermeture” de ma fenêtre…
Allez hop un petit tour sur le graphe de rétention et voila ce que ça donne :
J’ai passé un bon moment à comprendre que le problème ne venait pas du bouton Valider, mais du Tooltip lui même… C’est vrai, on s’attend plus à avoir un problème dans SON code plutôt que dans le code du .NET en fait :)
Bref, un petit tour dans le user control incriminé, un bon pattern IDisposable qui va bien, et voilà le “patch” :
Petit test pour vérifier tout ça :
La fuite mémoire n’a plus l’air de la partie. On va quand même vérifier les instances en mémoire :
AH ben y’en a quand même beaucoup moins !
Et voilà, un petit soucis de régler :)
Next !!!!
Bon monitoring de Noel à tous!