DebugDiag
DebugDiag 2 は完全に書き直され、実行可能ファイル (EXE および DLL) のセットになりました。必要な追加情報を含めるために簡単に変更できる一連のスクリプトではなくなりました。
DebugDiag の出力は、WinDbg+SOS の!dumpheap -stat
出力に表示されるものと似ています。
...
575a4518 11547 560508 System.Object[]
575d37b8 91 892344 System.Byte[]
575d2ee4 3488 927512 System.Int32[]
575d0d48 72920 6939284 System.String
Total 120639 objects
その他のアプローチ
SOS!do <address>
は子なしのサイズのみを示しますが!objsize <address>
、子を含むように見える SOS があります (Visual Studio 2013 とのクロスチェックはできず、2012 しかありません):
0:008> !do 0b938584
Name: SomeClass
MethodTable: 08947c0c
EEClass: 08956c38
Size: 292(0x124) bytes
...
0:008> !objsize 0b938584
sizeof(0b938584) = 11728 ( 0x2dd0) bytes (SomeClass)
!objsize
ヒープ上のすべてのオブジェクトに対してこれを行うには、ループ内の各オブジェクトに対して実行できます。
.foreach (address {!dumpheap -short}) {!objsize ${address}}
プロパティ値を再帰的にリストすることがわかっている唯一のコマンドは SOSEX です!mdt <address> -r
が、サイズは出力されません。
Pykd だけでルート オブジェクトを分析する
Pykdスクリプトの開始点:
0:000> .loadby sos clr; .loadby sos mscorwks
0:000> .load <full path>\sosex.dll
0:000> .load <full path>\pykd.pyd
0:000> !pycmd
>>> gch = dbgCommand("!gch")
>>> lines = gch.split('\n')
>>> for line in lines: dprint(dbgCommand("!objsize "+line[34:50]))
...
が表示されたら Enter を押し...
ます。[34:50]
これは 32 ビット用のアダプターである必要があるかもしれないことに注意してください。