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 a .NET 5-ös és újabb verziói támogatottak.

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 lehetővé tette a memóriaképek gyűjtését és elemzését Windows, Linux és macOS rendszeren anélkül, hogy natív hibakeresőkre lenne szükség. 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 collect
dotnet-dump elemzés
dotnet-dump ps

dotnet-dump collect

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.

    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 rendszeren.
    • 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.

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 struktúra adatait EEClass jeleníti meg a megadott címen.
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 struktúra adatait MethodDesc jeleníti meg a megadott címen.
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 megadott metódus vagy mező <sigaddr> <moduleaddr>aláírásának memóriaképe.
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 fut 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 MethodTable megadott típushoz vagy EEClass metódushoz tartozó struktúrákat a megadott modulban.
objsize A megadott objektum méretét jeleníti meg.
parallelstacks Az egyesített szálak veremét a Visual Studio "Párhuzamos veremek" paneléhez hasonlóan jeleníti meg.
pathto Megjeleníti a GC elérési útját a következőhöz <root><target>: .
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 .NET-hez készült SOS hibakeresési bővítményben találhatók.

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 memóriakép-létrehozási 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ó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