IIS のワーカプロセス上に存在するアプリケーションドメインの情報を取得する

Debugging Tools for Windowsを使用して、IIS のワーカプロセス上に存在するアプリケーションドメインの情報を取得する方法。

Debugging Tools for Windows のインストール

- Windows 用デバッグ ツール : 概要
http://www.microsoft.com/japan/whdc/DevTools/Debugging/default.mspx
上記サイトより、利用しているOSに合う Debugging Tools for Windows をダウンロードしてインストールする。
サイト中の下記リンクよりダウンロードが可能。
・Debugging Tools for Windows 32 ビット バージョンのインストール
・Debugging Tools for Windows 64 ビット バージョンのインストール
本パッケージに含まれるWinDbg を用いて AppDomain の情報を取得する。

シンボルパスの設定

WinDbg を使用するにあたって、まずはシンボルパスの設定を行う必要がある。
以下の手順でシンボルパスの設定を行う。
1. windbg.exe を起動する。 (デフォルトの設定でインストールした場合、 C:\Program Files\Debugging Tools for Windows\ にある。)
2. [File] メニューより [Symbol File Path] を選択する。 [Symbol Search Path] ダイアログが開く。
3. 開いたダイアログの Symbol path テキストボックスに、以下のように記入する。
SRV*<ダウンストリーム ストア>*http://msdl.microsoft.com/download/symbols
以下の手順を実施するにはMSのサイトで公開しているシンボルが必要となるが、上記ダウンストリーム ストア は、MSのサイトよりシンボルを自動的にダウンロードしキャッシュするフォルダとなる。ここには、自分が書き込み権限を持つ任意のフォルダを指定する。
たとえば、 C:\symbols をダウンストリームストアにする場合、以下のようになる。

SRV*C:\symbols*http://msdl.microsoft.com/download/symbols

- デバッグ ツールとシンボル : はじめに
http://www.microsoft.com/japan/whdc/DevTools/Debugging/debugstart.mspx

w3wp.exe の起動

ASP.NET アプリケーションを起動し、w3wp.exe を起動する。
タスクマネージャから w3wp.exe の PID を確認する。
w3wp.exe がタスクマネージャに現れない場合、実行ユーザごとのフィルタリングが行われている可能性がある。
その場合、 [すべてのユーザーのプロセスを表示] ボタンより、全ユーザのプロセスを表示する。

windbg によるプロセス中の AppDomain 情報の取得

管理者権限でコマンドプロンプトを起動する。
Debugging Tools for Windows のインストール先フォルダへ移動する。
(デフォルトでは C:\Program Files\Debugging Tools for Windowsにある)
以下のコマンドを実行する。

windbg.exe -c ".logopen <logfilename>;.loadby sos mscorwks;!dumpdomain;qd" -p <PID>

<logfilename> にはログファイルの出力先を、 <PID> には、情報を取得したいプロセスの PID を指定する。
今回の場合、 <PID> の部分には w3wp.exe の PID が入ることになる。
たとえば、 PID 1234 のプロセスの AppDomain の情報を c:\log.txt に出力する場合、以下のコマンドになる。

windbg.exe -c ".logopen c:\log.txt;.loadby sos mscorwks;!dumpdomain;qd" -p 1234

以上で、 windbg を用いて、プロセス中に含まれる AppDomain の情報を取得可能。
AppDomain の情報は、上記コマンドで指定した log.txt から確認できる。
その確認方法は以下の通り。

出力結果について

上記コマンドで出力した結果はテキストデータとして指定したパスに保存されている。
当該ファイルをテキストエディタにて開き、下記 2 行に該当する行を探す。

--------------------------------------
Domain <num>:
(<num> には 1 から始まりプロセス中に存在する AppDomain の数までの通し番号が入る。)

出力結果には、上記 2 行を区切りとしてプロセス中に含まれる AppDomain の情報が列挙されている。
この情報より、 AppDomain の存在有無について確認する。

出力結果例

--------------------------------------
Domain 4: 0ecc01a0
LowFrequencyHeap: 0ecc01c4
HighFrequencyHeap: 0ecc0210
StubHeap: 0ecc025c
Stage: OPEN
SecurityDescriptor: 016df778
Name: MyAppDomain_B
(以下、ロードされているアセンブリについての情報が続く)

補足

今回は、SOS デバッガ拡張に含まれている、 DumpDomain コマンドを用いることで、プロセス中の AppDomain の情報を取得した。
SOS デバッガ拡張の詳細は、以下のドキュメントを参照。
- SOS デバッガ拡張 (SOS.dll)
http://msdn.microsoft.com/ja-jp/library/bb190764.aspx