Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
dotnet globális eszköz:
A NuGet-csomag legújabb kiadási verziójának
dotnet-dumptelepítéséhez használja a dotnet eszköz telepítési parancsát:dotnet tool install --global dotnet-dumpKözvetlen letöltés:
Töltse le a platformnak megfelelő végrehajtható eszközt:
Operációs rendszer Plattform Windows x86 | x64 | Kar | Arm-x64 Linux x64 | Kar | Arm64 | musl-x64 | musl-Arm64
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
--versionMegjeleníti a dotnet-dump segédprogram verzióját.
-h|--helpParancssori 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|--helpParancssori 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,
Fullakkor 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.
--diagEngedélyezi a memóriaképek gyűjtésének diagnosztikai naplózását.
--crashreportEngedé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:
- Alapkonfiguráció-memóriakép gyűjtése:
dotnet-dump collect -p <pid> -o baseline.dmp - Hagyja, hogy az alkalmazás fusson, és használjon fel több memóriát.
- Gyűjtsön össze egy második memóriaképet:
dotnet-dump collect -p <pid> -o after.dmp - Elemezze mindkét memóriaképet, és hasonlítsa össze az
dumpheap -stateredmé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.