Microsoftは先日、NuGetパッケージマネージャを通じてMicrosoft.Diagnostics.Runtime (ClrMD) コンポーネントをリリースした。このコンポーネントを使用すると、調査タスクの自動化や、より多くのデバッグ情報へのアクセスが可能になる。このコンポーネントは.NETプログラムのクラッシュダンプをプログラムから調査するための拡張API群で、SOSデバッガー拡張 (SOS.dll) とほぼ同じように使用できる。また、アプリケーションのクラッシュ解析を自動的に作成する機能や、一般的なデバッガータスクを自動化する機能も備えている。
ClrMDコンポーネントを使用するには、DataTargetクラスのインスタンスを生成して、そのインスタンスにクラッシュダンプをロードするか、実行中の.NETプロセスをアタッチする必要がある。次に、TryGetDacLocation()メソッドを呼び出すことにより、そのマシン上でCLRとバージョンが一致するDACが検出される。検出されない場合、つまりCLRと調査対象のプロセスのバージョンが一致しない場合は、一致するCLRがインストールされているマシンからDACをコピーしてもよい。その場合、CreateRuntime()メソッドで代わりのmscordacwks.dllへのパスを手動で指定する。
このランタイムオブジェクトを使用して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パッケージコンポーネントに組み込まれているIntelliSense機能を利用すれば、複雑な名前のプロパティや関数も簡単に検索できる。
上記機能に加えて、ClrThreadオブジェクトにはCurrentExceptionプロパティが用意されている。通常、このプロパティにはNullが格納されるが、Nullでなければそのスレッドで最後にスローされた例外が格納され、さらにこの例外オブジェクトには完全なスタックトレース、スローされた例外のメッセージやタイプが格納される。