Memóriakép-gyűjtési és elemzési segédprogram (dotnet-dump)

Ez a cikk a ✔️ dotnet-dump 3.0.47001-es és újabb verziókra vonatkozik

Feljegyzés

dotnet-dump macOS esetén csak .NET 5-ös és újabb verziók támogatják.

Telepítés

Kétféleképpen tölthető le és telepíthető dotnet-dump:

Feljegyzés

dotnet-dump X86-alkalmazásokhoz az eszköz megfelelő x86-os verziójára van szükség.

Szinopszis

dotnet-dump [-h|--help] [--version] <command>

Leírás

A dotnet-dump globális eszköz segítségével összegyűjtheti és elemezheti a memóriaképeket Windows, Linux és macOS rendszeren anélkül, hogy natív hibakeresőt használnak. Ez az eszköz olyan platformokon fontos, mint az Alpine Linux, ahol nem érhető el teljesen működő lldb eszköz. Az dotnet-dump eszköz lehetővé teszi, hogy SOS-parancsokat futtasson az összeomlások és a szemétgyűjtő (GC) elemzéséhez, de nem natív hibakereső, így a natív veremkeretek megjelenítése nem támogatott.

Beállítások

  • --version

    Megjeleníti a dotnet-dump segédprogram verzióját.

  • -h|--help

    Parancssori súgót jelenít meg.

Parancsok

Parancs
dotnet-dump gyűjtés
dotnet-dump elemzés
dotnet-dump ps

dotnet-dump gyűjtés

Egy folyamatból származó memóriaképet rögzít.

Szinopszis

dotnet-dump collect [-h|--help] [-p|--process-id] [-n|--name] [--type] [-o|--output] [--diag] [--crashreport]

Beállítások

  • -h|--help

    Parancssori súgót jelenít meg.

  • -p|--process-id <PID>

    Megadja azt a folyamatazonosítót, amelyből memóriaképet gyűjthet.

  • -n|--name <name>

    Megadja annak a folyamatnak a nevét, amelyből memóriaképet szeretne gyűjteni.

  • --type <Full|Heap|Mini>

    Megadja a memóriakép típusát, amely meghatározza a folyamatból összegyűjtött információk típusait. Három típus létezik:

    • Full - A legnagyobb memóriakép, amely tartalmazza az összes memóriát, beleértve a modulképeket is.
    • Heap - Nagy és viszonylag átfogó memóriakép, amely modullistákat, szállistákat, minden vermet, kivételadatokat, információkat és minden memóriát tartalmaz, kivéve a leképezett képeket.
    • Mini - Egy kis memóriakép, amely tartalmazza a modullistákat, a szállistákat, a kivételadatokat és az összes vermet.
    • Triage - Egy kis memóriakép, amely tartalmazza a modullistákat, a szállistákat, a kivételadatokat, az összes vermet és a PII-t.

    Ha nincs megadva, Full akkor az alapértelmezett érték.

  • -o|--output <output_dump_path>

    A teljes elérési út és fájlnév, ahol az összegyűjtött memóriaképet meg kell írni. Győződjön meg arról, hogy a dotnet-folyamatot futtató felhasználó írási engedélyekkel rendelkezik a megadott könyvtárhoz.

    Ha nincs megadva:

    • Alapértelmezés szerint .\dump_YYYYMMDD_HHMMSS.dmp Windows.
    • A ./core_YYYYMMDD_HHMMSS alapértelmezett értéke Linux és macOS rendszeren.

    Az YYYYMMDD év/hónap/nap, a HHMMSS pedig óra/perc/másodperc.

  • --diag

    Engedélyezi a memóriaképek gyűjtésének diagnosztikai naplózását.

  • --crashreport

    Engedélyezi az összeomlási jelentések létrehozását.

Feljegyzés

Linux és macOS rendszeren ez a parancs elvárja a célalkalmazást, és dotnet-dump ugyanazt TMPDIR a környezeti változót használja. Ellenkező esetben a parancs időtúllépést fog végrehajtani.

Feljegyzés

A memóriaképek gyűjtéséhez dotnet-dumpa célfolyamatot futtató felhasználóval azonos felhasználóként vagy gyökérként kell futtatni. Ellenkező esetben az eszköz nem fog kapcsolatot létesíteni a célfolyamattal.

Feljegyzés

A teljes vagy halommemória összegyűjtése miatt az operációs rendszer jelentős virtuális memóriában lapozhat a célfolyamat számára. Ha a célfolyamat kényszerített memóriakorláttal rendelkező tárolóban fut, a megnövekedett memóriahasználat miatt az operációs rendszer leállíthatja a tárolót, ha túllépte a korlátot. Javasoljuk a tesztelést, hogy a memóriakorlát elég magas legyen. Egy másik lehetőség, hogy ideiglenesen módosítsa vagy távolítsa el a korlátot a memóriakép-gyűjtemény előtt, ha a környezet támogatja ezt.

dotnet-dump elemzés

Elindít egy interaktív rendszerhéjat egy memóriakép feltárásához. A rendszerhéj különböző SOS-parancsokat fogad el.

Szinopszis

dotnet-dump analyze <dump_path> [-h|--help] [-c|--command]

Argumentumok

  • <dump_path>

    Megadja az elemezni kívánt memóriaképfájl elérési útját.

Beállítások

  • -c|--command <debug_command>

    Futtatja a parancsot az indításkor. Ennek a paraméternek több példánya is használható a parancsok láncolására szolgáló meghívásban. A parancsok a parancssorban megadott sorrendben lesznek futtatva. Ha azt szeretné, hogy a dotnet-memóriakép a parancsok után lépjen ki, az utolsó parancsnak "exit" (kilépés) kell lennie.

SOS-parancsok elemzése

Parancs Függvény
analyzeoom Megjeleníti az utolsó OOM adatait, amely a GC-halomba irányuló foglalási kérelemben történt.
clrmodules Felsorolja a folyamat felügyelt moduljait.
clrstack Csak felügyelt kód veremkövetését biztosítja.
clrthreads Felsorolja a futó felügyelt szálakat.
clru Egy felügyelt metódus jegyzetekkel ellátott szétszerelését jeleníti meg.
d vagy readmemory Memóriatartalom memóriaképe.
dbgout Engedélyezi/letiltja (-off) a belső SOS-naplózást.
dso Megjeleníti az aktuális verem határán belül található összes felügyelt objektumot.
dumpalc Egy gyűjthető AssemblyLoadContext részleteit jeleníti meg, amelybe a megadott objektum betöltődik.
dumparray Egy felügyelt tömb részleteit jeleníti meg.
dumpasync Megjeleníti az aszinkron állapotú gépek adatait a szemétgyűjtési halomon.
dumpassembly Egy szerelvény részleteit jeleníti meg.
dumpclass A megadott cím EEClass szerkezetével kapcsolatos információkat jeleníti meg.
dumpconcurrentdictionary Egyidejű szótártartalmat jelenít meg.
dumpconcurrentqueue Egyidejű üzenetsor-tartalmat jelenít meg.
dumpdelegate Egy meghatalmazott adatainak megjelenítése.
dumpdomain Megjeleníti az összes AppDomain vagy a megadott szerelvények adatait.
dumpgcdata Megjeleníti a csoportházirend-adatokkal kapcsolatos információkat.
dumpgen A megadott generáció halomtartalmat jelenít meg.
dumpheap Információkat jelenít meg a szemétgyűjtési halomról és az objektumok gyűjtési statisztikáiról.
dumpil Megjeleníti a felügyelt metódushoz társított közös köztes nyelvet (CIL).
dumplog Egy memóriabeli stressznapló tartalmát írja a megadott fájlba.
dumpmd A megadott cím MethodDesc szerkezetével kapcsolatos információkat jeleníti meg.
dumpmodule A modul adatainak megjelenítése a megadott címen.
dumpmt A metódustáblával kapcsolatos információkat jeleníti meg a megadott címen.
dumpobj Megjeleníti az objektum adatait a megadott címen.
dumpruntimetypes Megkeresi az összes System.RuntimeType objektumot a GC-halomtárban, és kinyomtatja az általuk hivatkozott típusnevet és MethodTable-t is.
dumpsig A <sigaddr> <moduleaddr>által megadott metódus vagy mező aláírásának törlése.
dumpsigelem Egy aláírási objektum egyetlen elemének memóriaképe.
dumpstackobjects Megjeleníti az aktuális verem határán belül található összes felügyelt objektumot.
dumpvc Egy értékosztály mezőivel kapcsolatos információkat jelenít meg.
eeheap Megjeleníti a belső futtatókörnyezeti adatstruktúrák által felhasznált folyamatmemória adatait.
eestack A folyamat összes szálán futtat dumpstack.
eeversion A futtatókörnyezetre és az SOS-verziókra vonatkozó információkat jeleníti meg.
ehinfo Megjeleníti a kivételkezelési blokkokat egy JIT-ed metódusban.
exit vagy quit Kilép az interaktív módból.
finalizequeue Megjeleníti a véglegesítéshez regisztrált összes objektumot.
findappdomain GC-objektum AppDomainjének feloldása.
gchandles Megjeleníti a folyamat szemétgyűjtő fogópontjaira vonatkozó statisztikákat.
gcheapstat A szemétgyűjtő statisztikáit jeleníti meg.
gcinfo Megjeleníti egy metódus JIT GC-kódolását.
gcroot Információkat jelenít meg az objektumra mutató hivatkozásokról (vagy gyökerekről) a megadott címen.
gcwhere Megjeleníti a megadott cím GC-halomjának helyét.
histclear Felszabadítja a Hist parancscsalád által használt erőforrásokat.
histinit Inicializálja az SOS-struktúrákat a hibakeresésben mentett stressznaplóból.
histobj Megvizsgálja a stressznapló áthelyezési rekordjait, és megjeleníti azokat a szemétgyűjtési áthelyezések láncát, amelyek az argumentumként átadott címre vezethettek.
histobjfind Megjeleníti az összes olyan naplóbejegyzést, amely az objektumra hivatkozik a megadott címen.
histroot Megjeleníti a megadott gyökér előléptetésével és áthelyezésével kapcsolatos információkat.
histstats A stressznapló statisztikáit jeleníti meg.
ip2md MethodDesc A JIT által lefordított kódban a megadott címen jeleníti meg a struktúrát.
listnearobj Megjeleníti a megadott címet megelőző és azt követő objektumot.
logopen Engedélyezi a konzolfájl-naplózást.
logclose Letiltja a konzolfájl-naplózást.
logging Engedélyezi/letiltja a belső SOS-naplózást.
lm vagy modules Megjeleníti a folyamat natív moduljait.
name2ee Megjeleníti a megadott modulban megadott típushoz vagy metódushoz tartozó MethodTable és EEClass struktúrákat.
objsize A megadott objektum méretét jeleníti meg.
parallelstacks Az egyesített szálak veremét a Visual Studio "Párhuzamos veremek" panelhez hasonlóan jeleníti meg.
pathto Megjeleníti a GC elérési útját <root> és <target>között.
pe vagy printexception Megjeleníti és formázhatja a megadott címen található osztályból Exception származtatott objektumok mezőit.
r vagy registers Megjeleníti a szálregisztrálásokat.
runtimes Felsorolja a célban lévő futtatókörnyezeteket, vagy módosítja az alapértelmezett futtatókörnyezetet.
setclrpath Beállítja a coreclr dac/dbi fájlok betöltésének elérési útját a használatával setclrpath <path>.
setsymbolserver Engedélyezi a szimbólumkiszolgáló támogatását.
sos Különböző coreclr hibakeresési parancsokat hajt végre. Használja a szintaxist sos <command-name> <args>. További információ: "soshelp".
soshelp vagy help Megjeleníti az összes elérhető parancsot.
soshelp <command> vagy help <command> Megjeleníti a megadott parancsot.
syncblk Megjeleníti a SyncBlock tulajdonosának adatait.
taskstate Feladatállapot megjelenítése olvasható formátumban.
threadpool Megjeleníti a futtatókörnyezeti szálkészlet adatait.
threadpoolqueue Üzenetsorba helyezett szálkészlet munkaelemeit jeleníti meg.
threadstate Szép nyomtatja a jelentést a szálak állapotát.
threads <threadid> vagy setthread <threadid> Beállítja vagy megjeleníti az SOS-parancsok aktuális szálazonosítóját.
timerinfo A futó időzítőkkel kapcsolatos információkat jeleníti meg.
token2ee Megjeleníti a methodTable struktúrát és a MethodDesc struktúrát a megadott jogkivonathoz és modulhoz.
traverseheap Halomadatokat ír ki egy fájlba a CLR Profiler által ismert formátumban.
verifyheap Ellenőrzi a GC halomját, hogy vannak-e sérülés jelei.
verifyobj Ellenőrzi a sérülés jeleinek argumentumaként átadott objektumot.

Feljegyzés

További részletek a SOS hibakeresési bővítményben találhatók .NET.

dotnet-dump ps

Felsorolja azokat a dotnet-folyamatokat, amelyekből a memóriaképek gyűjthetők. dotnet-dump A 6.0.320703-as és újabb verziók is megjelenítik azokat a parancssori argumentumokat, amelyekkel az egyes folyamatok elindultak, ha elérhetők.

Szinopszis

dotnet-dump ps [-h|--help]

Példa

Tegyük fel, hogy a paranccsal dotnet run --configuration Releaseelindít egy hosszú ideig futó alkalmazást. Egy másik ablakban futtassa a dotnet-dump ps parancsot. A megjelenő kimenet a következő. Ha vannak ilyenek, a parancssori argumentumok a 6.0.320703-as és újabb verzióban dotnet-dump jelennek meg.

> dotnet-dump ps

  21932 dotnet     C:\Program Files\dotnet\dotnet.exe   run --configuration Release
  36656 dotnet     C:\Program Files\dotnet\dotnet.exe

Az dotnet-dump használata

Az első lépés egy memóriakép összegyűjtése. Ez a lépés kihagyható, ha már létrejött egy központi memóriakép. Az operációs rendszer vagy a .NET Core-futtatókörnyezet beépített dump generációs funkciója minden egyes mag-memóriaképet létrehozhat.

$ dotnet-dump collect --process-id 1902
Writing minidump to file ./core_20190226_135837
Written 98983936 bytes (24166 pages) to core file
Complete

Most elemezze az alapvető memóriaképet a analyze következő paranccsal:

$ dotnet-dump analyze ./core_20190226_135850
Loading core dump: ./core_20190226_135850
Ready to process analysis commands. Type 'help' to list available commands or 'help [command]' to get detailed help on a command.
Type 'quit' or 'exit' to exit the session.
>

Ez a művelet egy interaktív munkamenetet hoz létre, amely a következő parancsokat fogadja el:

> clrstack
OS Thread Id: 0x573d (0)
    Child SP               IP Call Site
00007FFD28B42C58 00007fb22c1a8ed9 [HelperMethodFrame_PROTECTOBJ: 00007ffd28b42c58] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) [/root/coreclr/src/mscorlib/src/System/Reflection/RuntimeMethodInfo.cs @ 472]
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.Program.Foo4(System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 54]
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.Program.Foo2(Int32, System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 29]
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.Program.Foo1(Int32, System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 24]
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.Program.Main(System.String[]) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 19]
00007FFD28B43210 00007fb22aa9cedf [GCFrame: 00007ffd28b43210]
00007FFD28B43610 00007fb22aa9cedf [GCFrame: 00007ffd28b43610]

Ha nem kezelt kivételt szeretne látni, amely megölte az alkalmazást:

> pe -lines
Exception object: 00007fb18c038590
Exception type:   System.Reflection.TargetInvocationException
Message:          Exception has been thrown by the target of an invocation.
InnerException:   System.Exception, Use !PrintException 00007FB18C038368 to see more.
StackTrace (generated):
SP               IP               Function
00007FFD28B42DD0 0000000000000000 System.Private.CoreLib.dll!System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Private.CoreLib.dll!System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)+0xa7 [/root/coreclr/src/mscorlib/src/System/Reflection/RuntimeMethodInfo.cs @ 472]
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.dll!SymbolTestApp.Program.Foo4(System.String)+0x15d [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 54]
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.dll!SymbolTestApp.Program.Foo2(Int32, System.String)+0x34 [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 29]
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.dll!SymbolTestApp.Program.Foo1(Int32, System.String)+0x3a [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 24]
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.dll!SymbolTestApp.Program.Main(System.String[])+0x6e [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 19]

StackTraceString: <none>
HResult: 80131604

Memóriaszivárgások és -lefoglalások elemzése

Memóriavesztés akkor fordul elő, ha az alkalmazás olyan objektumokra hivatkozik, amelyekre már nincs szükség, megakadályozva, hogy a szemétgyűjtő visszanyerje a memóriát. Segítségével dotnet-dump azonosíthatja a memóriavesztéseket, megkeresheti a legnagyobb objektumokat, és megtudhatja, hogy hol használják fel a memóriát.

A memóriaszivárgás hibakeresésének teljes útmutatóját lásd: Memóriaszivárgás hibakeresése .NET.

A legnagyobb objektumok azonosítása

dumpheap A paranccsal megtekintheti a -stat halom objektumainak összegzését a teljes méret szerint rendezve:

> dumpheap -stat

Statistics:
              MT    Count    TotalSize Class Name
00007f6c1eeefba8      576        59904 System.Reflection.RuntimeMethodInfo
00007f6c1dc021c8     1749        95696 System.SByte[]
00000000008c9db0     3847       116080      Free
00007f6c1e784a18      175       128640 System.Char[]
00007f6c1dbf5510      217       133504 System.Object[]
00007f6c1dc014c0      467       416464 System.Byte[]
00007f6c21625038        6      4063376 testwebapi.Controllers.Customer[]
00007f6c20a67498   200000      4800000 testwebapi.Controllers.Customer
00007f6c1dc00f90   206770     19494060 System.String
Total 428516 objects

Ez a kimenet azt mutatja, hogy mely típusok használják a legtöbb memóriát. Ebben a példában System.String az objektumok körülbelül 19 MB-ot, az objektumok pedig Customer körülbelül 4,8 MB-ot használnak fel.

Objektumok azonosítása névtér vagy szerelvény alapján

Ha meg szeretné tudni, hogy mely modulok vagy névterek használnak memóriát, használja a -type részleges típusnevet a találatok szűréséhez:

> dumpheap -type MyCompany.Data -stat

Statistics:
              MT    Count    TotalSize Class Name
00007f6c21625038    15000      3600000 MyCompany.Data.CustomerRecord
00007f6c21625040     8000      2560000 MyCompany.Data.OrderHistory
00007f6c21625048     2000       960000 MyCompany.Data.ProductCache
Total 25000 objects, 7120000 bytes

Ez a megközelítés segít azonosítani, hogy a kódbázis mely részei felelősek a memóriahasználatért.

A példányok legmagasabb számának megkeresése

Ha meg szeretné nézni, hogy mely típusok rendelkeznek a legtöbb példányt, függetlenül a teljes mérettől, tekintse meg a kimenet Darabszám oszlopát dumpheap -stat . A magas példányszámú objektumok nem hatékony objektumlétrehozási vagy gyorsítótárazási problémákat jelezhetnek:

> dumpheap -stat

Statistics:
              MT    Count    TotalSize Class Name
00007f6c1dc00f90   206770     19494060 System.String
00007f6c20a67498   200000      4800000 testwebapi.Controllers.Customer
00007f6c1dc021c8     1749        95696 System.SByte[]

Ez a példa 206 770 String példányt és 200 000 Customer példányt mutat be.

Objektumhivatkozások elemzése gcroot használatával

A nagy vagy számos objektum azonosítása után megtudhatja, gcroot hogy miért nem gyűjtik össze az objektumokat. A gcroot parancs megjeleníti a referencialáncot a GC-gyökerektől egy adott objektumig:

> dumpheap -mt 00007f6c20a67498
         Address               MT     Size
00007f6ad09421f8 00007f6c20a67498       24
...

> gcroot 00007f6ad09421f8

Thread 3f68:
    00007F6795BB58A0 00007F6C1D7D0745 testwebapi.Controllers.CustomerCache.GetAll()
        rbx:  (interior)
            ->  00007F6BDFFFF038 System.Object[]
            ->  00007F69D0033570 testwebapi.Controllers.Processor
            ->  00007F69D0033588 testwebapi.Controllers.CustomerCache
            ->  00007F69D00335A0 System.Collections.Generic.List`1[[testwebapi.Controllers.Customer]]
            ->  00007F6C000148A0 testwebapi.Controllers.Customer[]
            ->  00007F6AD0942258 testwebapi.Controllers.Customer

Found 1 root.

Ez a kimenet azt mutatja, hogy az Customer objektumot egy CustomerCache objektum tartja, amely segít azonosítani a szivárgás forrását a kódban.

Memória elemzése objektumméret szerint

Az objektumok méret szerinti szűréséhez használja az -min és -max a beállításokat:

> dumpheap -min 100000 -stat

Statistics:
              MT    Count    TotalSize Class Name
00007f6c21625038        6      4063376 testwebapi.Controllers.Customer[]
00007f6c1dc014c0       12       416464 System.Byte[]
Total 18 objects

Ez a parancs csak a 100 000 bájtnál nagyobb objektumokat jeleníti meg, így a legnagyobb memóriafelhasználókra összpontosíthat.

Keresd meg a holtpontokat

Holtponti helyzetek diagnosztizálására használható dotnet-dump , amikor a szálak le vannak tiltva az erőforrásokra való várakozás során. A holtpont teljes hibakeresési útmutatója: Debug a deadlock in .NET.

Az összes szál listázása

A parancs használatával megtekintheti az threads összes felügyelt szálat:

> threads
*0 0x1DBFF (121855)
 1 0x1DC01 (121857)
 2 0x1DC02 (121858)
 ...

Szálveremek vizsgálata

Az összes szál hívásveremeinek megtekintésére használható clrstack -all :

> clrstack -all

Keresse meg azokat a mintákat, amelyeken Monitor.Enter több szál blokkolva van, vagy hasonló szinkronizálási primitívek.

Zárolási tulajdonosok keresése

syncblk A parancs használatával megtekintheti, hogy mely szálak tartják a zárolásokat, és mely szálak várakoznak:

> syncblk
Index         SyncBlock MonitorHeld Recursion Owning Thread Info          SyncBlock Owner
   43 00000246E51268B8          603         1 0000024B713F4E30 5634  28   00000249654b14c0 System.Object
   44 00000246E5126908            3         1 0000024B713F47E0 51d4  29   00000249654b14d8 System.Object

A MonitorHeld oszlop a zárolásra váró szálak számát jeleníti meg. A Tulajdonosi szál adatai oszlopban látható, hogy melyik szál rendelkezik a zárolással.

Speciális memóriaelemzési forgatókönyvek

Több memóriakép összehasonlítása

A memória időbeli növekedésének megértéséhez gyűjtsön össze több memóriaképet, és hasonlítsa össze őket:

  1. Alapkonfiguráció-memóriakép gyűjtése: dotnet-dump collect -p <pid> -o baseline.dmp
  2. Hagyja, hogy az alkalmazás fusson, és használjon fel több memóriát.
  3. Gyűjtsön össze egy második memóriaképet: dotnet-dump collect -p <pid> -o after.dmp
  4. Elemezze mindkét memóriaképet, és hasonlítsa össze az dumpheap -stat eredményeket.

Keresse meg azokat a típusokat, amelyek a második memóriaképben jelentősen több példányt vagy nagyobb teljes méretet mutatnak.

Memória elemzése adott objektumtípusokhoz

Egy adott típusú összes példány kivétele:

> dumpheap -type Customer
         Address               MT     Size
00007f6ad09421f8 00007f6c20a67498       24
00007f6ad0942210 00007f6c20a67498       24
...

Ezután használhatja dumpobj az egyes objektumok vizsgálatára:

> dumpobj 00007f6ad09421f8
Name:        testwebapi.Controllers.Customer
MethodTable: 00007f6c20a67498
EEClass:     00007f6c21625000
Size:        24(0x18) bytes
File:        /app/testwebapi.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007f6c1dc00f90  4000001        8        System.String  0 instance 00007f6ad09421f0 Name
00007f6c1dbf4c18  4000002       10         System.Int32  1 instance               42 Id

Memóriakép gyűjtése Docker-tárolóban

dotnet-dump a tárolóban képességeket igényel ptrace . A tároló megadásának egyik gyakori módja a tároló indítása a következővel --cap-add=SYS_PTRACE: . A környezettől függően előfordulhat, hogy módosítania kell a tároló seccomp profilját is. A tároló biztonsági konfigurációs problémáinak diagnosztizálásához tekintse meg a Memóriaképek: gyakori kérdések című témakört.

Ha dotnet-dump az éles rendszerképben a .NET SDK nélkül szeretné telepíteni, használja a direct letöltési hivatkozásokat a Telepítés szakaszból, vagy használjon multi-fázisú Docker-buildet az eszköz bináris fájljainak SDK-lemezképből való másolásához. A tárolódiagnosztikára vonatkozó teljes útmutatásért lásd: Diagnosztikák gyűjtése Linux-tárolókban.

Memóriakép-gyűjteményekkel kapcsolatos problémák elhárítása

A memóriaképek gyűjtéséhez a folyamatnak képesnek kell lennie a hívásra ptrace. Ha problémákat tapasztal a memóriaképek gyűjtésével kapcsolatban, előfordulhat, hogy a futtatott környezet úgy van konfigurálva, hogy korlátozza az ilyen hívásokat. Tekintse meg a Memóriaképek: gyakori kérdések hibaelhárítási tippeket és a gyakori problémák lehetséges megoldásait.

Lásd még