BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース CLR Memory Diagnosticsで検査タスクの自動化が可能に

CLR Memory Diagnosticsで検査タスクの自動化が可能に

原文(投稿日:2013/06/10)へのリンク

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でなければそのスレッドで最後にスローされた例外が格納され、さらにこの例外オブジェクトには完全なスタックトレース、スローされた例外のメッセージやタイプが格納される。

この記事に星をつける

おすすめ度
スタイル

BT