Silverlight アプリケーションパフォーマンスを調べたりするには、以下のような方法があります。
マネージヒープに確保されたオブジェクトのメモリサイズなどを調べるには、SOS デバッガ拡張を使用することができます。SOS デバッガ拡張が使えることをご存じの方もいらっしゃることでしょう。今回は、SOS デバッガ拡張を使って Silverlight アプリケーションのマネージヒープの調べ方をご紹介します。必要になるツールは、Windows デバッガ(WinDbg)です。Windows デバッガは、Windows SDK に含まれていますので Windows SDK を導入する必要があります。
上記に示した URL から該当する Windows SDK をダウンロードしてください。ここでは、Windows 7 x64 環境に Windows SDK 7.1 をインストールします。この時にインストールするオプションは、少なくとも以下のものを選択します。
特に再配布モジュールからデバッグツールをインストールすることを忘れないようにしてください。これは、Windows 7 x64 環境でインストールされるデバッグツールが x64 向けになるためです。インストールが終了したら、「\ProgramFiles\Microsoft SDKs\Windows\v7.1\Redist\Debugging Tools for Windows\dbg_x86.msi」をインストールします。x86 用のデバッグツールをインストールする理由は、デバッグする Silverligjht ランタイムが 32 ビットだからです。これで、SOS デバッガ拡張を使用する準備が整いました。以降が、実際の SOS デバッガ拡張の使用方法になります。
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
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
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 デバッガ拡張との機能差があるとは思いますが、オブジェクトのメモリ使用量などを正確に調べることができることを理解できたことでしょう。