SOSNET

Avec SOSNet, je dis STOP aux bugs!!

J’étais en train de manipuler les AppDomains sur mon projet DotNetServer (oui je sais le nom pu) et je voulais analyser la mémoire pour en savoir plus sur les Assembly chargée dans les AppDomains.

Pour cela, on peut utiliser WinDBG avec son extension SOS (Son of Strike) qui permet d’effectuer quelques commandes pour .Net. Il existe aussi une extension à SOS pour des commandes très utiles en .net: SOSEX.

Mais voila, WinDBG c’est barbare, en ligne de commande et pas très clair.
Yann Shwartz nous a fait une présentation sur touts ça lors d’une session ALT.Net, mais même après 1h d’explication, je crois qu’on est plus d’un à avoir laissé tombé la chose tellement c’est compliqué à utiliser.

Mais Yann a développé un outil formidable (oui oui, vraiment) qui permet de faire du LINQ sur nos objets en mémoire. Le projet s’appelle linqdbg et je vous invite tous à y contribuer. Associer cela à LinqPad et vous obtenez un outil puissant d’analyse de la mémoire de votre programme.

Mais je trouve tout de même que ce n’est pas la solution que j’attend. J’ai voulu quelque chose de plus « ergonomique » pour débuter avec Windbg.
J’ai trouvé pour cela SOSAssist mais je n’ai même pas réussi à l’exécuter (problème avec Windows 64bit?).

Ne trouvant rien d’équivalent, j’ai décidé de faire mon WinDBG Next Gen 🙂
Les sources du projet se trouve sur bitbucket car je suis devenu plus fan de Mercurial (HG) que de GIT.
Pour les plus flémard d’entre vous, vous pouvez télécharger la version compilée.

Et pour les vrais grosses huitres qui ne veulent même pas télécharger et l’exécuter, voici des screen de ce qui est possible de faire 😉

Sélectionnez une processus pour s'y attacher
Vous pouvez visualiser les AppDomains
Vous pouvez voir les Assembly chargée dans un AppDomain
Listing des types chargés en mémoire (avec recherche)
Double-click sur un type: vous voyez les instances. Double-click sur l'instance: vous voyez le détails de ses champs
Double-click sur un champ d'un objet: vous voyez le détail du membre... avec un 'Breadcrumb' pour naviguer entre les instances
La navigation d'instance fonctionne aussi avec les tableaux (sélection d'index)
Toutes les 'actions' sont tracées en ligne de commande. Il est toujours possible d'utilise les commandes comme avec WinDBG!!
Publicités

7 réflexions sur “SOSNET

  1. Ca m’a l’air vraiment bien. J’avais eu un mal fou à faire tourner SOSAssist et son interface était d’une confusion telle que windbg avait l’air clair à côté. Tu as pris le parti de la simplicité et du 80/20, ça me semble plus réaliste.

    L’idéal serait aussi d’implémenter !GCRoot et !CLRStack pour traiter une bonne partie des tâches usuelles de troubleshooting.

    Quant à linqdbg, je compte le relancer (en migrant vers git, même si je préfère moi aussi Hg). Les deux approches sont à mon sens complémentaires. Je vais faire un pull du repo bitbucket pour regarder tout ça.

    Encore bravo !

  2. Merci Grozeille! cet outil m’interesse doublement:

    – je dois reprendre un probleme memoire sur une application qui utilise pas mal de libs de calcul, et j’en etais juste aux rudiments d’utilisation de windbg (1000 mercis a Yann pour la présentation et les slides)
    – je dois faire un refactoring d’un outil interne de type testing, visant a rendre le chargement des assemblies référencées et l’execution des tests indépendants du appdomain host (pour le moment j’ai « hacké » salement pour permettre de faire marcher les références), les la communication inter app domain n’est pas aisée et j’espère que le code de DotNetServer sera plus facile a appréhender que celui de NUnit sur ce point

    Yann, tu devrais faire ces petites choses sur http://blog.polom.com :

    – mettre quelques liens vers le repo linqdbg, je n’avais pas connaissance de son existance publique avant de lire cet article.
    – permettre les commentaires (ce qui retire la charge du premier point)
    – remplacer ton blog par un flux en provenance de ton compte sur siffloteur qui semble d’avantage maintenu 😉

  3. @Yann: c’est encore loin d’être parfait, il y a plein de bugs (quand on click la ou il ne faut pas au mauvais moment) et je n’exploite pas encore SOSEX.
    Je prend note pour GCRoot et CLRStack, j’ai pas encore eu le temps de le faire…
    Je verrais bien aussi un onglet avec l’éditeur de code de SharpDevelop, pour permettre de faire du Linqdbg 🙂
    @Gauthier: je vois que tu commences déjà à fixer les bugs dans SOSNET 🙂
    J’ai mis à jour le Wiki du coup: http://bitbucket.org/grozeille/sosnet/wiki/Home (je vais sans doute faire un lien depuis l’appli dans le menu Help)
    J’ai aussi listé les bugs/enhancements dans le bugtracker de Bitbucket: http://bitbucket.org/grozeille/sosnet/issues/?status=new&status=open

    http://geekswithblogs.net/.netonmymind/archive/2006/03/14/72262.aspx

  4. On pourrait peut être éviter la duplication des efforts sur ce qui est de linqdbg, du parsing et du modèle ?

    J’ai vu que tu étais moins crade que moi pour la fermeture de cdb. Tout ce qui est parsing des sorties cdb est assez pénible, autant joindre nos efforts pour ne le faire qu’une fois ?

    1. J’avoue que j’aime bien ton modèle de parsing, avec des objet « commande » qui on la responsabilité d’exécuter la commande et analyser le résultat.

      Par contre j’ai trouvé un peu complexe certains passage (le TSVMapper).
      De mon coté, j’ai fait le crado, car le parsing est « mal fait » avec des regex et des « Readline » de partout, ça pique les yeux.
      De plus, le code du parsing de toutes les commandes se trouve dans le « controller » ce qui est moche.

      En fait, j’aurai pu utiliser LinqDBG pour requêter CDB, mais comme tu as vu, j’ai eu besoin de plus et je suis aller assez vite dans l’implémentation (pas propre, mais ça marche).
      Si tu arrives a refactoriser LinqDBG pour qu’il soit utilisable par le controller, alors ça déchire tout.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s