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
Pokud dostáváte chybu ve stylu "Unable to load DLL mscordacwks", tak se hodí níže uvedený příkaz, který zapne podrobné hlášky o načítání DLL, kde se hledají a jaké, dostanete tak informaci, jakou verzi je potřeba sehnat. Cestu pak lze nastavit přes File/Symbols Path...
.cordll -ve -u -l
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
PSSCOR2.dll - nástupce SOS.dll
Z webu Microsoftu si můžete stáhnout též PSSCOR2.dll, nástupce knihovny SOS.dll. Původní možnosti SOS.dll jsou podstatně rozšířeny.
Po stažení jsou k dispozici různé verze, je potřeba zavést tu verzi, podle toho jaký dump budete analyzovat:
.load D:\Temp\amd64\psscor2.dll