CLR Memory Diagnostics 支持自动化检查任务

  • Anand Narayanaswamy
  • 臧秀涛

2013 年 6 月 13 日

话题:语言 & 开发

微软最近发布了Microsoft.Diagnostics.Runtime组件,该组件在 NuGet 包管理器中被称作 ClrMD,支持开发者自动化检查任务及访问更多调试信息。它是一组高级 API,用于以编程方式检查.NET 程序的崩溃转储文件,和SOS Debugging Extensions(SOS.dll)差不多,它支持为应用程序编写自动化的崩溃分析,还支持将很多常见调试器任务的自动化。

要使用 ClrMD 组件,需要创建DataTarget类的一个实例,它或者表示一个崩溃转储文件,或者表示一个正在运行的.NET 进程。创建完毕之后,必须调用 TryGetDacLocation() 方法,该方法试图在当前这台机器上找到匹配的 DAC。不过,如果当前机器上没有安装匹配的 CLR,可以从已安装的机器上把 DAC 复制过来,只需要手动把对应的 mscordacwks.dll 的路径提供给 CreateRuntime() 方法。

之后可以利用运行时对象来检查 GC 堆的内容,它会产生下面这样的输出:

23B1D30       36 System.Security.PermissionSet

23B1D54       20 Microsoft.Win32.SafeHandles.SafePEFileHandle

23B1D68       32 System.Security.Policy.PEFileEvidenceFactory

23B1D88       40 System.Security.Policy.Evidence

现在开发者有了输出堆统计信息所需要的数据,输出可以通过这种方式进行——使用LINQ查询将堆信息按类型分组,按总的对象大小排序。产生的输出类似下面这样:

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 也支持检索 GC 堆的一般信息、遍历 CLR 的句柄表和进程中的应用域及识别加载了哪些模块。除了收集.NET 运行时所使用的各种堆相关的数据,它还支持枚举线程、这些线程的调用栈、线程上最后抛出的异常及进程的对象根。包括在 ClrMD 包组件中的智能感知支持开发者探索各种复杂的属性和函数。

除上述特性外,ClrThread 对象包含了一个 CurrentException 属性,还包含了完整的栈跟踪信息及所抛出异常的消息和类型。CurrentException 属性可能为空,如果为空,它会包含当前线程最后抛出的异常。

查看英文原文:CLR Memory Diagnostics Enables you to Automate Inspection Tasks

语言 & 开发