Microsoft a récemment mis à disposition le composant Microsoft.Diagnostics.Runtime, qui fut un temps appelé ClrMD, via NuGet Package Manager. Celui-ci permet d'automatiser les tâches d'inspection et d'accéder à toujours plus d'informations pour le debugging. Il s'agit d'un ensemble d'APIs avancées permettant d'inspecter de façon programmatique le crash dump d'un programme .NET, à la façon des extensions de debugging SOS (SOS.dll), et apporte la possibilité de mettre en place l'automatisation d'analyses de crash de votre application ou autres nombreuses tâches de debugging courantes.
Pour travailler avec le composant ClrMD, vous devez créer une instance de la classe DataTarget, qui représente soit un crash dump, soit un processus .NET en cours. Ensuite, vous devez appeler la méthode TryGetDacLocation(), qui va tenter de localiser un DAC correspondant sur la machine. Si vous souhaitez inspecter un processus et que votre machine ne possède pas la CLR correspondante, vous pouvez aussi manuellement copier le DAC d'une autre machine, sur laquelle est installée la CLR correspondante, et fournir le chemin vers la DLL mscordacwks.dll à la méthode CreateRuntime().
Vous pouvez alors utiliser l'objet runtime pour examiner le contenu du tas, "le GC heap", à partir du résultat obtenu sous la forme suivante :
23B1D30 36 System.Security.PermissionSet
23B1D54 20 Microsoft.Win32.SafeHandles.SafePEFileHandle
23B1D68 32 System.Security.Policy.PEFileEvidenceFactory
23B1D88 40 System.Security.Policy.Evidence
Vous avez ici à disposition toutes les données nécessaires pour récupérer un ensemble de statistiques sur le tas, par exemple à partir d'une requête LINQ pour grouper le contenu du tas par type et trier par le volume total occupé par les objets. Le résultat ressemblera à ceci :
564 11 System.Int32[]
616 2 System.Globalization.CultureData
680 18 System.String[]
728 26 System.RuntimeType
790 7 System.Char[]
5,788 165 System.String
17,252 6 System.Object[]
ClrMD offre également la possibilité de récupérer des informations générales concernant le GC heap, permet de parcourir la table d'handle de la CLR, les domaines d'applications portés par le processus et identifie les modules chargés dans ces domaines. Il peut énumérer les threads, récupérer pour chacun la pile d'appel ou la dernière exception levée ainsi que les objets racines du processus, ou encore récolter toute donnée sur les différents tas dont se sert le runtime de la CLR. L'intelliSense vous permettra d'explorer les différentes propriétés et fonctions disponibles incluses dans le package.
Pour finir en complétant les fonctionnalités citées ci-dessus, l'objet ClrThread possède une propriété CurrentException, qui contient, si elle n'est pas nulle, la stack trace complète, le message et le type de la dernière exception levée sur le thread.