Silverlight アプリケーションのマネージヒープを調べるには


Silverlight アプリケーションパフォーマンスを調べたりするには、以下のような方法があります。

マネージヒープに確保されたオブジェクトのメモリサイズなどを調べるには、SOS デバッガ拡張を使用することができます。SOS デバッガ拡張が使えることをご存じの方もいらっしゃることでしょう。今回は、SOS デバッガ拡張を使って Silverlight アプリケーションのマネージヒープの調べ方をご紹介します。必要になるツールは、Windows デバッガ(WinDbg)です。Windows デバッガは、Windows SDK に含まれていますので Windows SDK を導入する必要があります。

上記に示した URL から該当する Windows SDK をダウンロードしてください。ここでは、Windows 7 x64 環境に Windows SDK 7.1 をインストールします。この時にインストールするオプションは、少なくとも以下のものを選択します。

  • Debugging Tool for Windows
  • Redistributable Packages - Debugging Tools (再配布モジュール)

特に再配布モジュールからデバッグツールをインストールすることを忘れないようにしてください。これは、Windows 7 x64 環境でインストールされるデバッグツールが x64 向けになるためです。インストールが終了したら、「\ProgramFiles\Microsoft SDKs\Windows\v7.1\Redist\Debugging Tools for Windows\dbg_x86.msi」をインストールします。x86 用のデバッグツールをインストールする理由は、デバッグする Silverligjht ランタイムが 32 ビットだからです。これで、SOS デバッガ拡張を使用する準備が整いました。以降が、実際の SOS デバッガ拡張の使用方法になります。

  1. 目的の Silverlight アプリケーションを起動します。
    私の場合は、デバッグ用の HTML を IE9 でブラウズします。
  2. Silverlight アプリケーションが動作している IE9 のプロセス ID を調べます。この作業には、プロセスエクスプローラーか Visual Studio を使用すると便利です。
    Visual Studio の [デバッグ]-[プロセスへアッタチ] の場合
    Attach to process
    型の列に Silverlight が表示されているのが、目的の IE9 のプロセスです。

    プロセス エクスプローラーの場合
    Process Explorer
    プロセス エクスプローラーの下部にモジュールを表示していれば、その中に coreclr.dll が読み込まれているプロセスが該当する IE9 のプロセスになります。

    IE 8 / 9 は、プロセス分離によって子プロセスが生成されるためにこのようになっています。Windows のタスクマネージャのアプリケーションに表示されているプロセスは、親プロセスのため Silverlight をホストしているプロセスでないことに注意が必要です。

  3. [スタートメニュー]-[Debugging Tools for Windows (x86)]-[WinDbg] を起動します。
  4. [File]-[Attach to a process …] を使って、調べたプロセス ID へ接続します。
    WinDbg
  5. Command ウィンドウのコマンドラインに 「.load @"C:\Program Files (x86)\Microsoft Silverlight\5.0.61118.0\sos.dll"」を入力します。
    「@""」の形式でなければ、ダブルバックスラッシュをパス区切りに指定して下さい。x86 Windows 環境であれば、「Program Files」となります。ここのポイントは、sos.dll に対するフルパスで指定することです。
  6. 次にマネージヒープを統計情報を調べるために、「!dunmpheap -stat」コマンドを入力してみます。
    0:039> .load @"C:\Program Files (x86)\Microsoft Silverlight\5.0.61118.0\sos.dll"
    0:039> !dumpheap -stat
    *********************************************************************
    * Symbols can not be loaded because symbol path is not initialized. *
    *                                                                   *
    * The Symbol Path can be set by:                                    *
    *   using the _NT_SYMBOL_PATH environment variable.                 *
    *   using the -y <symbol_path> argument when starting the debugger. *
    *   using .sympath and .sympath+                                    *
    *********************************************************************
    PDB symbol for clr.dll not loaded
    Statistics:
          MT    Count    TotalSize Class Name
    71d3d4fc        1           12 System.Windows.RuntimeHost.HostAppDomainManager
    64a14ba8        1           12 System.Collections.Generic.GenericEqualityComparer`1[[System.Int32, mscorlib]]
    64a0bea8        1           12 System.Collections.Generic.GenericEqualityComparer`1[[System.UInt32, mscorlib]]
    64a08bb4        1           12 System.Nullable`1[[System.Boolean, mscorlib]]
    64a020dc        1           12 System.Runtime.Remoting.ObjectHandle
    649fe818        1           12 System.Reflection.Missing
    649fccb4        1           12 System.Collections.Generic.ObjectEqualityComparer`1[[System.Object, mscorlib]]
    649f84c8        1           12 System.RuntimeType+TypeCacheQueue
    649f45e0        1           12 System.Resources.FastResourceComparer
    649f3ab0        1           12 System.DefaultBinder
    以下省略
    Total 14491 objects
  7. 今度は、「!dumpheap -type クラス名」コマンドで特定のクラスの情報を確認してみます。
    0:039> !dumpheap -type Sl5test.MainPage
     Address       MT     Size
    16518f84 092f4e9c      100     
    
    Statistics:
          MT    Count    TotalSize Class Name
    092f4e9c        1          100 Sl5test.MainPage
    Total 1 objects
  8. クラス情報からオブジェクトのアドレスが判明すれば、「!dumpobj オブジェクトのアドレス」コマンドでオブジェクトの情報を確認します。
    0:039> !dumpobj 16518f84
    Name:        Sl5test.MainPage
    MethodTable: 092f4e9c
    EEClass:     092f19e4
    Size:        100(0x64) bytes
    File:        Sl5test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    Fields:
          MT    Field   Offset                 Type VT     Attr    Value Name
    60148494  4000499        4 ...eObjectSafeHandle  0 instance 16518ff4 m_nativePtr
    601486f4  400049a        8 ... System.Windows]]  0 instance 00000000 _valueTable
    以下省略

最後に WinDbg を終了する前にデバッガを停止します(つまり、プロセスからのデタッチです)。参考に示した SOS デバッガ拡張のコマンドを使用することで、マネージヒープの状態を調べることができます。.NET Framework 版の SOS デバッガ拡張との機能差があるとは思いますが、オブジェクトのメモリ使用量などを正確に調べることができることを理解できたことでしょう。

Comments (0)

Skip to main content