3

Visual Studio 2013 は、包括的なサイズ (子オブジェクトのサイズを含む) の列を表示できます - http://blogs.msdn.com/b/visualstudioalm/archive/2013/10/16/net-memory-analysis-enhancements-in -visual-studio-2013.aspx

DebugDiag のメモリ分析レポートは現在、子オブジェクトを含まないオブジェクト サイズのみを表示します。DebugDiag のレポートに子オブジェクトのサイズを含める方法はありますか?

Visual Studio は .NET 4.5 クラッシュ ダンプの分析のみをサポートしているため、.NET 4.0 のレポートを生成するための良い方法を教えてください。

包括的サイズ

4

1 に答える 1

4

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 ビット用のアダプターである必要があるかもしれないことに注意してください。

于 2014-09-18T14:09:37.237 に答える