BT

Diffuser les Connaissances et l'Innovation dans le Développement Logiciel d'Entreprise

Contribuez

Sujets

Sélectionner votre région

Accueil InfoQ Actualités Automatiser ses tâches d'inspection avec CLR Memory Diagnostics

Automatiser ses tâches d'inspection avec CLR Memory Diagnostics

Favoris

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.

Evaluer cet article

Pertinence
Style

Contenu Éducatif

BT