Facilitating the Spread of Knowledge and Innovation in Professional Software Development

Write for InfoQ


Choose your language

InfoQ Homepage News CLR Memory Diagnostics Enables you to Automate Inspection Tasks

CLR Memory Diagnostics Enables you to Automate Inspection Tasks

This item in japanese

Lire ce contenu en français

Microsoft recently released Microsoft.Diagnostics.Runtime component shortly called as ClrMD via the NuGet Package Manager that allows you to automate inspection tasks and access even more debugging information. It is a set of advanced APIs for programmatically inspecting a crash dump of a .NET program much in the same way as the SOS Debugging Extensions (SOS.dll) and it provides you an ability to write automated crash analysis for your applications and automate many common debugger tasks.

In order to work with ClrMD component, you need to create an instance of DataTarget class, which represents either a crash dump or a live .NET process. After that you have to call TryGetDacLocation() method that attempts to find a matching DAC on the same machine. However, you can also copy the DAC from a machine where a matching CLR is installed if you need to inspect a process for which you do not have a matching CLR by providing the path to the alternate mscordacwks.dll to the CreateRuntime() method manually.

You can then make use of the runtime object to inspect the contents of the GC heap which produces an output as shown below

23B1D30       36 System.Security.PermissionSet
23B1D54       20 Microsoft.Win32.SafeHandles.SafePEFileHandle
23B1D68       32 System.Security.Policy.PEFileEvidenceFactory
23B1D88       40 System.Security.Policy.Evidence

You now have the required data to output a set of heap statistics that can be done by using a LINQ query to group the heap by type and sort by total object size. The resulting output will look like as shown below

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 also enables you to retrieve general information about the GC heap, walks the CLRs handle table, application domains in the process and identifies which modules are loaded into them. It also enumerates threads, callstacks of those threads, the last thrown exception on threads and object roots of the process in addition to gathering of data about the various heaps that the .NET runtime make use of. The IntelliSense included with the ClrMD package component enables you to explore the various complicated properties and functions.

In addition to the above features, ClrThread object also contains a CurrentException property whuch may be null and contains the full stack trace, message and type of the exception thrown. If not null then it will contain the last thrown exception on this thread.

Rate this Article