troushoo

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

  1. --/--/--(--) --:--:--|
  2. スポンサー広告

.NET のプロセスやダンプの調査に使えるライブラリ : ClrMD

概要

.NETのプロセスやダンプの調査に使えるライブラリ – ClrMD – を紹介します。
ClrMD は、Microsoft のエンジニアにより公開されたライブラリで、Microsoft 社内でも使われているものです。

内容

ClrMD を用いると、.NET のプロセスやダンプを調査するためのプログラムを作成することができます。
すなわち、SOS デバッガーエクステンション(= sos.dll) が行っているようなことを行うプログラムを作成することができます。
よって、ClrMD を用いると、調査の自動化を達成することができます。

以下、ClrMD のインストール方法、簡単な使用例、特徴を紹介します。

ClrMD のインストール方法
ClrMD のインストールは”ライブラリ パッケージ マネージャー” を用いて簡単に行うことができます。
*2013/11/22 現在、ClrMD はBeta バージョンです。

1. C# のプロジェクトを作成します。

2. “ツール” –> “ライブラリ パッケージ マネージャー” –> “パッケージ マネージャー コンソール” をクリックします。
パッケージ マネージャー コンソールを起動

3. “Install-Package Microsoft.Diagnostics.Runtime –Pre” を実行します。
Install-Package Microsoft.Diagnostics.Runtime –Pre

4. 正常にインストールされたことを確認します。
正常にインストールされたことを確認する

簡単な使用例
以下、ClrMD を用いて、.NET プロセスのヒープのオブジェクトタイプ、サイズを調べる方法を紹介します。

1. 名前空間を追加します。

using Microsoft.Diagnostics.Runtime;

2. プロセスにアタッチします。

int pid = System.Diagnostics.Process.GetProcessesByName("MyTestApp")[0].Id;
using (DataTarget dataTarget = DataTarget.AttachToProcess(pid, 5000)) //プロセスにアタッチ
{
   string dacLocation = dataTarget.ClrVersions[0].TryGetDacLocation(); //DAC の場所を取得
ClrRuntime runtime = dataTarget.CreateRuntime(dacLocation); //ランタイムを作成
}

上記のTryGetDacLocation とCreateRuntime について補足します。

ClrMD では、.NET アプリ/ダンプ の情報を調べるのにDAC を使用します。DAC はData Access Component の略で、mscordacwks.dll に実装されています。
DAC の場所は、調査をする.NET アプリ/ダンプ に依存して異なるので、TryGetDacLocation を用いてDAC の場所を探しています。
DAC

そして、TryGetDacLocation でみつかったDAC の場所をCreateRuntime に渡し、調査に使用するランタイムを作成します。

ダンプの調査時等にTryGetDacLocation でDAC が見つからない場合は、ClrMD を実行しているマシンに必要なDAC がない可能性があります。そのような場合は、ダンプを取得したマシンからmscordacwks.dll を持ってくればOK です。

3. ヒープの情報を出力します。

ClrHeap heap = runtime.GetHeap(); //ヒープ情報を取得
foreach (ulong obj in heap.EnumerateObjects())
{
ClrType type = heap.GetObjectType(obj); //ヒープにあるオブジェクトのタイプを取得
ulong size = type.GetSize(obj); //ヒープにあるオブジェクトのサイズを取得
System.Console.WriteLine("{0,12:X} {1,8:n0} {2}", obj, size, type.Name); //出力
}

4. 結果、以下のように”MyTestApp” のヒープの状態がわかります。
ヒープの情報がわかる

ClrMD の特徴
上記した例以外にも、ClrMD には以下のような特徴があります。
・GC ヒープの情報取得
・CLR のハンドルテーブルの情報取得
・アプリのドメイン情報を取得し、モジュールがどのドメインにロードされているかの調査
・スレッドのコールスタックの表示
・最後にスローされた例外情報の表示
・プロセスのルートオブジェクトの探索
・オブジェクトのフィールド情報表示

すべての機能はClrRuntime かClrHeap オブジェクトに実装されています。
IntelliSense でヘルプを表示してくれます。
IntelliSense にヘルプが表示される

今回用いたサンプルコード
今回用いたサンプルコードの全文は以下になります。
using Microsoft.Diagnostics.Runtime;

namespace MyClrMDTest1
{
class Program
{
static void Main(string[] args)
{
int pid = System.Diagnostics.Process.GetProcessesByName("MyTestApp")[0].Id;
using (DataTarget dataTarget = DataTarget.AttachToProcess(pid, 5000)) //プロセスにアタッチ
{
string dacLocation = dataTarget.ClrVersions[0].TryGetDacLocation(); //DAC の場所を取得
ClrRuntime runtime = dataTarget.CreateRuntime(dacLocation); //ランタイムを作成

ClrHeap heap = runtime.GetHeap(); //ヒープ情報を取得
foreach (ulong obj in heap.EnumerateObjects())
{
   ClrType type = heap.GetObjectType(obj); //ヒープにあるオブジェクトのタイプを取得
ulong size = type.GetSize(obj); //ヒープにあるオブジェクトのサイズを取得
System.Console.WriteLine("{0,12:X} {1,8:n0} {2}", obj, size, type.Name); //出力
}
}
}
}
}



情報元
.NET Crash Dump and Live Process Inspection (英語)
CLR Memory Diagnostics (ClrMD) (英語)
  1. 2013/11/24(日) 22:29:59|
  2. SOS・Psscor2/Psscor4
  3. | トラックバック:0
  4. | コメント:0
<<Fiddler でキャプチャーしたウェブアクセスをVisual Studio Ultimate を用いて再送 | ホーム | Wireshark の”Mark Packet” : パケットに’お気に入り’ を設定>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/145-199665e2
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (24)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。