.NET Memory Internals

18
Ing. Bc. Robert Haken MVP Development | MCT [email protected] | @RobertHaken Advanced Debugging .NET

Transcript of .NET Memory Internals

Page 1: .NET Memory Internals

Ing. Bc. Robert HakenMVP Development | MCT

[email protected] | @RobertHaken

Advanced Debugging .NET

Page 2: .NET Memory Internals

Windows Debugger + .NET extensions

DebugDiag

dema

Agenda

Page 3: .NET Memory Internals

DEMOStackOverflowException – DebugDiag, WinDbg

Page 4: .NET Memory Internals

Debugging Tools for Windows

WinDbg – „GUI“

NTSD – new console

CSD – classic console

DebugDiag -

samostatné

součást Windows SDK

www.windbg.org

Page 5: .NET Memory Internals

Debugger Extensions pro .NET

.load C:\path\to\extension.dll

SOS.dll – Son of Strike, součást .NET

.loadby sos mscorwks (.NET < 4)

.loadby sos clr (.NET >= 4)

PSSCOR2/PSSCOR4 – širší SOS (web)

SOSEX, NetEx – 3rd party

!help [<command>]

Page 6: .NET Memory Internals

Záludnosti použití Debuggeru

Platform - x86 vs. x64 vs. ...

Symbols

.symfix (MSFT Symbols Server)

.sympath, .sympath+

.reload

.NET Data Access Layer (mscordacwks.dll)

.cordll -ve -u –l

stejná verze, jako na laděném stroji (dtto SOS)

Page 7: .NET Memory Internals

Režimy práce s Debuggerem

Open Executable... (g pro Run)

Attach to a Process...

Open Crash Dump...

Task Manager / Create Dump File (!!32-bit vs. x64 stroj)

DebugDiag / ADPLUS

Windows Error Reporting

WIN32 API (extern v .NET)

Windows Crash Dump (native)

Page 8: .NET Memory Internals

DebugDiag

„user“-friendly UI

připravené analýzy

sběr dat/dumpů

pod pokličkou debugger services

voláno např. i z Azure Web Apps KUDU

Page 9: .NET Memory Internals

DEMODebugDiag demo report

Page 10: .NET Memory Internals

Stack Examination

!ClrStack [-i] [-a] [-l] [-p]

!DumpStack [-EE]

!EEStack [-EE] (all threads)

!DumpStackObjects (typy)

Page 11: .NET Memory Internals

DEMO01-StackHeap, x64

Page 12: .NET Memory Internals

Heap Examination

!DumpHeap [-stat] [-type <name>][-mt <MTaddr>] [-live|dead]

!HeapStat [-inclUnrooted]

!GCRoot <ObjAddr> !GCHandles

!EEHeap –gc

!FinalizationQueue [-allReady]

!FindAppDomain <ObjAddr>

Page 13: .NET Memory Internals

Object Inspection

!DumpObject <ObjAddr>

!DumpArray <ObjAddr>

!DumpVC <MTaddr> <ObjAddr>

dd <addr>

dq <addr>

!ObjSize <ObjAddr>

Page 14: .NET Memory Internals

Error Diagnostics

!PrintException [ObjAddr] [-nested]

!DumpAllExceptions (PSSCOR4)

!wdae (NETEXT)

!wpe (NETEXT)

!VerifyHeap

!VerifyObj <ObjAddr>

!analyze -v (native)

Page 15: .NET Memory Internals

Threads

!Threads !ThreadState <state>

~123s

!ThreadPool

Page 16: .NET Memory Internals

.NET Internals - AppDomains

System

zakládá Shared a Application

loaduje mscorlib.dll (into Shared)

spravuje AppDomains, spravuje strings

předvytvoří instance výjimek OoM, SO, ...

Shared

obsahuje mscorlib.dll + basic types - string, enum, ..

Application (n)

user code

!DumpDomain [<addr>]

Page 17: .NET Memory Internals

.NET Internals - Assemblies

Assembly = unit of deployment

manifest

jeden nebo několik Modules

self-describing

!DumpAssembly <AssAddr>

!DumpModule [-mt] <ModuleAddr>

!DumpMT <MTaddr>

!IP2MD <IPaddr> !DumpMD <MDaddr>

Page 18: .NET Memory Internals

www.showit.sk

www.gopas.sk