WinDbg等で使用できる.NET用のデバッガエクステンションsosでマネージヒープの情報を表示する!DumpHeapについて説明します。
今回使用するアプリ
以下のサンプルアプリを起動し、Console.ReadLine()でWinDbgをアタッチし、!DumpHeapを利用してその時のobj.iが本当に1234であるかを調べてみます。
namespace DumpHeap
{
class MyObj
{
public int i;
}
class Program
{
static void Main(string[] args)
{
MyObj obj = new MyObj();
obj.i = 1234;
Console.ReadLine();
Console.WriteLine(obj.i);
}
}
}
[!DumpHeap]
!DumpHeapの出力結果は2つに分かれております。
前半は、マネージドヒープにあるすべてのオブジェクトのアドレス、メソッドテーブル、サイズを表示します。
後半は、Statisticsから始まる行で、クラス名でグルーピングされた情報を表示します。メソッドテーブル、インスタンスの数、サイズ、クラスの名前を表示します。
0:004> !DumpHeap
Address MT Size
02661000 004d0d58 12 Free
~略~
0266ba84 001c3880 12
~略~
03663240 004d0d58 16 Free
total 0 objects
Statistics:
MT Count TotalSize Class Name
71a56524 1 12 System.Nullable`1[[System.Boolean, mscorlib]]
~略~
001c3880 1 12 DumpHeap.MyObj
~略~
71a06ba8 68 19220 System.Object[]
Total 857 objects
後半の出力を見るとDumpHeap.MyObjeのMT(メソッドテーブル)のアドレスが001c3880であることがわかります。前半を見るとMTが001c3880であるオブジェクトのアドレスは0266ba84 であるので、それを!DumpObjを使用してみてみます。
0:004> !DumpObj 0266ba84
Name: DumpHeap.MyObj
MethodTable: 001c3880
EEClass: 001c1480
Size: 12(0xc) bytes
File: C:\Users\seven\Documents\Visual Studio 2010\Projects\DumpHeap\DumpHeap\bin\Debug\DumpHeap.exe
Fields:
MT Field Offset Type VT Attr Value Name
71a528f8 4000001 4 System.Int32 1 instance 1234 i
iの値が1234であることがわかります。
[!dumpheapのその他の引数]
・!DumHeap -type <タイプ名>
特定のタイプのみの!DumpHeapを表示します。
0:004> !DumpHeap -type DumpHeap.MyObj
Address MT Size
0266ba84 001c3880 12
total 0 objects
Statistics:
MT Count TotalSize Class Name
001c3880 1 12 DumpHeap.MyObj
Total 1 objects
・!DumpHeap -mt <メソッドテーブルのアドレス>
外套のメソッドテーブルのみ表示します。
0:004> !DumpHeap -mt 001c3880
Address MT Size
0266ba84 001c3880 12
total 0 objects
Statistics:
MT Count TotalSize Class Name
001c3880 1 12 DumpHeap.MyObj
Total 1 objects
・!DumpHeap –stat
!DumpHeapの出力の後半部分のみを表示します。
0:004> !DumpHeap -stat
total 0 objects
Statistics:
MT Count TotalSize Class Name
71a56524 1 12 System.Nullable`1[[System.Boolean, mscorlib]]
~略~
001c3880 1 12 DumpHeap.MyObj
~略~
71a06ba8 68 19220 System.Object[]
Total 857 objects
・!dumpheap -min <数字>
<数字>バイトより大きいサイズのオブジェクトを表示します。
0:004> !DumpHeap -min 4905
Address MT Size
02667290 71a06ba8 8208
total 0 objects
Statistics:
MT Count TotalSize Class Name
71a06ba8 1 8208 System.Object[]
Total 1 objects
・!DumpHeap -max <数字>
<数字>バイトより小さいサイズのオブジェクトを表示します。
0:004> !DumpHeap -max 13
Address MT Size
02661000 004d0d58 12 Free
~略~
0266c3c8 71a528f8 12
total 0 objects
Statistics:
MT Count TotalSize Class Name
71a56524 1 12 System.Nullable`1[[System.Boolean, mscorlib]]
~略~
71a4f568 6 72 System.Object
Total 33 objects
・!DumpHeap -StartAtLowerBound <アドレス>
アドレスが<アドレス>以上のオブジェクトを表示します。
0:004> !DumpHeap -StartAtLowerBound 0266c774
Address MT Size
0266c774 71a4f92c 24
0266c78c 71a4f92c 28
total 0 objects
Statistics:
MT Count TotalSize Class Name
71a4f92c 2 52 System.String
Total 2 objects
リンク
・MSDNによる!dumpheap含むsos.dllの説明
http://msdn.microsoft.com/en-us/library/bb190764.aspx