Hulpprogramma voor dumpverzameling en -analyse (dotnet-dump)

Dit artikel is van toepassing op: ✔️ dotnet-dump versie 3.0.47001 en nieuwere versies

Notitie

dotnet-dump voor macOS wordt alleen ondersteund met .NET 5 en nieuwere versies.

Installeren

Er zijn twee manieren om te downloaden en installeren dotnet-dump:

Notitie

Als u een x86-app wilt gebruiken dotnet-dump , hebt u een bijbehorende x86-versie van het hulpprogramma nodig.

Samenvatting

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

Beschrijving

Het dotnet-dump globale hulpprogramma is een manier om dumps te verzamelen en te analyseren in Windows, Linux en macOS zonder dat er een systeemeigen foutopsporingsprogramma betrokken is. Dit hulpprogramma is belangrijk op platforms zoals Alpine Linux, waar een volledig werkende lldb versie niet beschikbaar is. Met dotnet-dump het hulpprogramma kunt u SOS-opdrachten uitvoeren om crashes en de garbagecollector (GC) te analyseren, maar het is geen systeemeigen foutopsporingsprogramma, zodat het weergeven van systeemeigen stackframes niet wordt ondersteund.

Opties

  • --version

    Geeft de versie van het dotnet-dump-hulpprogramma weer.

  • -h|--help

    Toont opdrachtregelhulp.

Opdracht

Opdracht
dotnet-dump collect
dotnet-dump analyseren
dotnet-dump ps

dotnet-dump collect

Legt een dump vast van een proces.

Samenvatting

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

Opties

  • -h|--help

    Toont opdrachtregelhulp.

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

    Hiermee geeft u het proces-id-nummer voor het verzamelen van een dump van.

  • -n|--name <name>

    Hiermee geeft u de naam van het proces voor het verzamelen van een dump van.

  • --type <Full|Heap|Mini>

    Hiermee geeft u het dumptype op, waarmee wordt bepaald welke soorten informatie uit het proces worden verzameld. Er zijn drie typen:

    • Full - De grootste dump met alle geheugen inclusief de module-installatiekopieën.
    • Heap - Een grote en relatief uitgebreide dump met modulelijsten, threadlijsten, alle stacks, uitzonderingsinformatie, handle-informatie en alle geheugen, met uitzondering van toegewezen afbeeldingen.
    • Mini - Een kleine dump met modulelijsten, threadlijsten, uitzonderingsgegevens en alle stacks.

    Als dit niet is opgegeven, Full is dit de standaardwaarde.

  • -o|--output <output_dump_path>

    Het volledige pad en de bestandsnaam waarin de verzamelde dump moet worden geschreven. Zorg ervoor dat de gebruiker waaronder het dotnet-proces wordt uitgevoerd schrijfmachtigingen heeft voor de opgegeven map.

    Als dit niet is opgegeven:

    • Standaard ingesteld op .\dump_YYYYMMDD_HHMMSS.dmp in Windows.
    • Standaard ingesteld op ./core_YYYYMMDD_HHMMSS in Linux en macOS.

    JJJJMMDD is Year/Month/Day en HHMMSS is Hour/Minute/Second.

  • --diag

    Hiermee schakelt u diagnostische logboekregistratie van dumpverzamelingen in.

  • --crashreport

    Hiermee schakelt u het genereren van crashrapporten in.

Notitie

In Linux en macOS verwacht deze opdracht de doeltoepassing en dotnet-dump deelt deze dezelfde TMPDIR omgevingsvariabele. Anders treedt er een time-out op voor de opdracht.

Notitie

Als u een dump wilt verzamelen met behulp van dotnet-dump, moet deze worden uitgevoerd als dezelfde gebruiker als het doelproces van de gebruiker of als root. Anders kan het hulpprogramma geen verbinding maken met het doelproces.

dotnet-dump analyseren

Start een interactieve shell om een dump te verkennen. De shell accepteert verschillende SOS-opdrachten.

Samenvatting

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

Argumenten

  • <dump_path>

    Hiermee geeft u het pad naar het dumpbestand dat moet worden geanalyseerd.

Opties

  • -c|--command <debug_command>

    Hiermee voert u de opdracht uit bij het starten. Meerdere exemplaren van deze parameter kunnen worden gebruikt in een aanroep om opdrachten te koppelen. Opdrachten worden uitgevoerd in de volgorde waarin ze zijn opgegeven op de opdrachtregel. Als u wilt dat dotnetdump na de opdrachten wordt afgesloten, moet de laatste opdracht 'exit' zijn.

SOS-opdrachten analyseren

Opdracht Functie
analyzeoom Geeft de informatie weer van de laatste OOM die is opgetreden bij een toewijzingsaanvraag voor de GC-heap.
clrmodules Geeft een lijst weer van de beheerde modules in het proces.
clrstack Biedt alleen een stacktracering van beheerde code.
clrthreads Geeft een lijst weer van de beheerde threads die worden uitgevoerd.
clru Geeft een geannoteerde demontage van een beheerde methode weer.
d of readmemory Dumpt geheugeninhoud.
dbgout Hiermee schakelt u () interne SOS-logboekregistratie in-off of uit.
dso Geeft alle beheerde objecten weer die binnen de grenzen van de huidige stack zijn gevonden.
dumpalc Geeft details weer over een collectible AssemblyLoadContext waarnaar het opgegeven object wordt geladen.
dumparray Geeft details weer over een beheerde matrix.
dumpasync Geeft informatie weer over asynchrone statusmachines op de door garbage verzamelde heap.
dumpassembly Geeft details weer over een assembly.
dumpclass Geeft informatie weer over de EEClass structuur op het opgegeven adres.
dumpconcurrentdictionary Geeft gelijktijdige woordenlijstinhoud weer.
dumpconcurrentqueue Geeft gelijktijdige wachtrijinhoud weer.
dumpdelegate Geeft informatie weer over een gemachtigde.
dumpdomain Geeft informatie weer over de alle assembly's binnen alle AppDomains of de opgegeven.
dumpgcdata Geeft informatie weer over de GC-gegevens.
dumpgen Geeft heap-inhoud weer voor de opgegeven generatie.
dumpheap Geeft informatie weer over de verzamelde heap- en verzamelingsstatistieken over objecten.
dumpil Geeft de algemene tussenliggende taal (CIL) weer die is gekoppeld aan een beheerde methode.
dumplog Hiermee schrijft u de inhoud van een stresslogboek in het geheugen naar het opgegeven bestand.
dumpmd Geeft informatie weer over de MethodDesc structuur op het opgegeven adres.
dumpmodule Geeft informatie weer over de module op het opgegeven adres.
dumpmt Geeft informatie weer over de methodetabel op het opgegeven adres.
dumpobj Geeft informatie weer over het object op het opgegeven adres.
dumpruntimetypes Hiermee vindt u alle System.RuntimeType-objecten in de GC-heap en worden ook de typenaam en MethodTable afgedrukt.
dumpsig Dumpt de handtekening van een methode of veld dat is opgegeven door <sigaddr> <moduleaddr>.
dumpsigelem Dumpt één element van een handtekeningobject.
dumpstackobjects Geeft alle beheerde objecten weer die binnen de grenzen van de huidige stack zijn gevonden.
dumpvc Geeft informatie weer over de velden van een waardeklasse.
eeheap Geeft informatie weer over procesgeheugen dat wordt verbruikt door interne runtimegegevensstructuren.
eestack Wordt dumpstack uitgevoerd op alle threads in het proces.
eeversion Geeft informatie weer over de runtime- en SOS-versies.
ehinfo Geeft de afhandelingsblokken voor uitzonderingen weer in een JIT-methode.
exit of quit Hiermee wordt de interactieve modus afgesloten.
finalizequeue Geeft alle objecten weer die zijn geregistreerd voor de voltooien.
findappdomain Probeert het AppDomain van een GC-object op te lossen.
gchandles Geeft statistieken weer over garbagecollection-ingangen in het proces.
gcheapstat Geeft statistieken weer over garbagecollection.
gcinfo Geeft de JIT GC-codering voor een methode weer.
gcroot Geeft informatie weer over verwijzingen (of wortels) naar het object op het opgegeven adres.
gcwhere Geeft de locatie weer in de GC-heap van het opgegeven adres.
histclear Publiceert alle resources die worden gebruikt door de familie van Hist-opdrachten.
histinit Initialiseert de SOS-structuren uit het stresslogboek dat is opgeslagen in de foutopsporing.
histobj Onderzoekt alle herlocatierecords van stresslogboeken en toont de keten van garbagecollectionverplaatsingen die mogelijk hebben geleid tot het adres dat als argument is doorgegeven.
histobjfind Geeft alle logboekvermeldingen weer die verwijzen naar het object op het opgegeven adres.
histroot Geeft informatie weer met betrekking tot zowel promoties als verplaatsingen van de opgegeven hoofdmap.
histstats Geeft stresslogboekstatistieken weer.
ip2md Geeft de MethodDesc structuur weer op het opgegeven adres in code die is gecompileerd met JIT.
listnearobj Geeft het object dat voorafgaat aan en het opgegeven adres slaagt.
logopen Hiermee schakelt u logboekregistratie van consolebestanden in.
logclose Schakelt logboekregistratie van consolebestanden uit.
logging Hiermee schakelt u interne SOS-logboekregistratie in of uit.
lm of modules Geeft de systeemeigen modules in het proces weer.
name2ee Geeft de MethodTable en EEClass structuren weer voor het opgegeven type of de opgegeven methode in de opgegeven module.
objsize Geeft de grootte van het opgegeven object weer.
parallelstacks Geeft de samengevoegde threadsstack op dezelfde manier weer als het deelvenster 'Parallelle stacks' van Visual Studio.
pathto Geeft het GC-pad van <root> naar <target>.
pe of printexception Hiermee worden velden weergegeven en opgemaakt van een object dat is afgeleid van de Exception klasse op het opgegeven adres.
r of registers Geeft de registers van de thread weer.
runtimes Geeft een lijst weer van de runtimes in het doel of wijzigt de standaardruntime.
setclrpath Hiermee stelt u het pad in om coreclr dac/dbi-bestanden te laden met behulp van setclrpath <path>.
setsymbolserver Hiermee schakelt u de ondersteuning van de symboolserver in.
sos Voert verschillende coreclr-foutopsporingsopdrachten uit. Gebruik de syntaxis sos <command-name> <args>. Zie 'soshelp' voor meer informatie.
soshelp of help Geeft alle beschikbare opdrachten weer.
soshelp <command> of help <command> Geeft de opgegeven opdracht weer.
syncblk Geeft de informatie van de SyncBlock-houder weer.
taskstate Geeft een taakstatus weer in een door mensen leesbare indeling.
threadpool Geeft informatie weer over de runtime-threadgroep.
threadpoolqueue Hiermee worden werkitems in de wachtrij geplaatste threadpool weergegeven.
threadstate Vrij drukt de betekenis van een threadsstatus af.
threads <threadid> of setthread <threadid> Hiermee stelt u de huidige thread-id voor de SOS-opdrachten in of geeft u deze weer.
timerinfo Geeft informatie weer over het uitvoeren van timers.
token2ee Geeft de MethodTable-structuur en MethodDesc-structuur weer voor het opgegeven token en de opgegeven module.
traverseheap Schrijft heapgegevens naar een bestand in een indeling die wordt begrepen door de CLR Profiler.
verifyheap Controleert de GC heap op tekenen van corruptie.
verifyobj Controleert het object dat wordt doorgegeven als argument voor tekenen van beschadiging.

Notitie

Meer informatie vindt u in de SOS-foutopsporingsextensie voor .NET.

dotnet-dump ps

Een overzicht van de dotnet-processen waaruit dumps kunnen worden verzameld. dotnet-dump versie 6.0.320703 en latere versies geven ook de opdrachtregelargumenten weer waarmee elk proces is gestart, indien beschikbaar.

Samenvatting

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

Opmerking

Stel dat u een langlopende app start met behulp van de opdracht dotnet run --configuration Release. In een ander venster voert u de dotnet-dump ps opdracht uit. De uitvoer die u ziet, is als volgt. De opdrachtregelargumenten, indien aanwezig, worden weergegeven in dotnet-dump versie 6.0.320703 en hoger.

> dotnet-dump ps

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

dotnet-dump gebruiken

De eerste stap is het verzamelen van een dump. Deze stap kan worden overgeslagen als er al een kerndump is gegenereerd. Het besturingssysteem of de ingebouwde dumpgeneratiefunctie van de .NET Core-runtime kan elk kerndump maken.

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

Analyseer nu de kerndump met de analyze opdracht:

$ 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.
>

Met deze actie wordt een interactieve sessie weergegeven die opdrachten accepteert zoals:

> 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]

Als u een onverwerkte uitzondering wilt zien die uw app heeft gedood:

> 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

Problemen met dumpverzameling oplossen

Dumpverzameling vereist dat het proces kan worden aangeroepen ptrace. Als u problemen ondervindt met het verzamelen van dumps, is de omgeving waarop u werkt mogelijk geconfigureerd om dergelijke aanroepen te beperken. Zie onze dumps: veelgestelde vragen over het oplossen van tips en mogelijke oplossingen voor veelvoorkomende problemen.

Zie ook