Mim

Select * from Seb where Sujets in (SQL Server 2008, ADO.NET, Visual Studio 2008)

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

2_profiling_application_screen

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 :

 

3_first_snapshot_results

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

12_object_retention_graph

 

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)

image

Le nombre d’instances en mémoire explosent très vite du coup :

imageJe note surtout la présence de ma fenêtre MDI, qui contient l’ensemble des autres composants. ah ah ! problème ici :)

imageEt 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 :image

 

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” :

imagePetit test pour vérifier tout ça :

image

La fuite mémoire n’a plus l’air de la partie. On va quand même vérifier les instances en mémoire :

image

AH ben y’en a quand même beaucoup moins !

Et voilà, un petit soucis de régler :)

Next !!!!

Bon monitoring de Noel à tous!

Commentaires

Twitter Trackbacks for Memory Leak sur le Tooltip dans une fen??tre MDI - Mim [dotmim.com] on Topsy.com a dit :

Pingback depuis  Twitter Trackbacks for                 Memory Leak sur le Tooltip dans une fen??tre MDI - Mim         [dotmim.com]        on Topsy.com

# décembre 29, 2009 2:43