Nemám teď prostor se široce rozepisovat, takže spíš jenom rychlé poznámky z mého postupu analýzy obsahu .NET heapu z memory dumpu.
Memory dump vytvoříme např. z Task Manageru, pravým tlačítkem na proces a "Create Dump File". Získaný soubor .dmp si přeneseme na vývojářskou mašinu, kde máme nainstalováno WinDbg (a .NET Framework, jehož součástí je SOS.dll extenze pro WinDbg).
Po otevření dumpu ve WinDbg (File / Open Crash Dump...) používáme následující příkazy:
Zavedení SOS.dll extenzí:
.loadby sos.dll mscorwks
Základní statistika heapu, zejména výpis jednotlivých datových typů a objem paměti, kterou zabírají.
!dumpheap -stat
Výpis objektů z dané MethodTable (objekty daného typu), adresu získáme ze sloupce MT z předchozího příkazu (první sloupec):
!dumpheap -mt <MethodTableAddress>
Dump objektu (výpis jeho hodnot, atp.), adresu získáme z předchozího příkazu (první sloupec):
!do <ObjectAddress>
Vypsání všech referencí na objekt (od rootových), tj. proč nám objekt visí v paměti na není čištěn GC:
!gcroot <ObjectAddress>
Velikost objektu včetně všech jeho podstromu (toho, co referencuje):
!objsize <ObjectAddress>
Help pro určitý příkaz SOS.dll
!help <příkaz>
Odkazy, které se mohou hodit:
http://blogs.msdn.com/b/cclayton/archive/2010/06/22/basic-analysis-of-a-managed-memory-dump-net.aspx
http://www.codeproject.com/KB/dotnet/Memory_Leak_Detection.aspx
http://blogs.msdn.com/b/tess/
http://msdn.microsoft.com/en-us/library/bb190764.aspx