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í (pozor na 32 vs. 64-bir verzi):
.load c:\Windows\Microsoft.NET\Framework64\v2.0.50727\SOS.DLL
popř.
.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. Většinou je potřeba stáhnout knihovny ze stroje, ze kterého pochází dump a na DLL pak cestu nastavit nastavit přes File/Symbols Path...
.cordll -ve -u -l
Výpis velikosti managed-heapu(-ů):
.eeheap -gc
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>
Filtrováno na určitý název typu (zadat stačí jakýkoliv substring názvu typu)
!dumpheap -stat -type <TypeNameQuery>
Dump objektu (výpis jeho hodnot, atp.), adresu získáme z předchozího příkazu (první sloupec):
!do <ObjectAddress>
Dump pole (abychom nemuseli jít po jednotlivých prvcích)
!dumparray <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
http://blogs.msdn.com/b/alejacma/archive/2009/06/30/sos-cheat-sheet-net-2-0-3-0-3-5.aspx
PSSCOR2.dll, resp. PSSCOR4.dll - nástupce SOS.dll
Z webu Microsoftu si můžete stáhnout též PSSCOR2.dll nebo PSSCOR4.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
Statistiku heapu dostaneme např.
!heapstat [-inclUnrooted]
nebo též
!CLRUsage
V !dumpdomain lze například použít přepínač -stat k získání statistik načtených assemblies a jejich velikosti v paměti
!dumpdomain -stat
Výpis všech výjimek
!DumpAllExceptions
Výpis aktivních HttpContextů
!ASPXPages
a také další užitečné věci, kde název mluví za všechno
!DumpASPNETCache
!DumpHttpRuntime
!DumpXmlDocument <ObjectAddress>
Velmi užitečné mohou být i příkazy pro nalezení assemblies zkompilovaných v DEBUG-modu
!FindDebugTrue
!FindDebugModules
Existuje téř pár nedokumentovaných
!FindInterestingStrings
!SaveSnapshot
!LoadSnapshot
!dumpconfig
!GCUsage
!VerifyDAC
DebugDiag
Dalším zajímavým nástrojem pro analýzu memory-dumpu je DebugDiag a jeho "Analysis mode". Předhodíte mu .dmp a vypadne z něj HTML report, v kterém se toho opět spoustu dozvíte.