Hilfsprogramm zum Sammeln und Analysieren von Speicherabbildern (dotnet-dump)
Dieser Artikel gilt für: ✔️ dotnet-dump
3.0.47001 und höhere Versionen
Hinweis
dotnet-dump
für macOS wird nur mit .NET 5 und höheren Versionen unterstützt.
Installieren
Es gibt zwei Möglichkeiten, dotnet-dump
herunterzuladen und zu installieren:
Globales dotnet-Tool:
Verwenden Sie zum Installieren der neuesten Releaseversion des NuGet-Pakets
dotnet-dump
den Befehl dotnet tool install:dotnet tool install --global dotnet-dump
Direkter Download:
Laden Sie die ausführbare Datei für das Tool herunter, die Ihrer Plattform entspricht:
OS Plattform Windows x86 | x64 | Arm | Arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
Hinweis
Sie benötigen eine entsprechende x86-Version des Tools, um dotnet-dump
für eine x86-App verwenden zu können.
Übersicht
dotnet-dump [-h|--help] [--version] <command>
Beschreibung
Mit dem globalen Tool dotnet-dump
können Sie unter Windows, Linux und macOS ohne nativen Debugger Speicherabbilder sammeln und analysieren. Dieses Tool ist auf Plattformen wie z. B. Alpine Linux wichtig, bei denen kein voll funktionsfähiges Tool lldb
verfügbar ist. Mit dem Tool dotnet-dump
können Sie SOS-Befehle zum Analysieren von Abstürzen und dem Garbage Collector (GC) ausführen, es handelt sich jedoch nicht um einen nativen Debugger, sodass Elemente wie das Anzeigen von nativen Stapelrahmen nicht unterstützt werden.
Optionen
--version
Mit dieser Option wird die Version des Hilfsprogramms „dotnet-dump“ angezeigt.
-h|--help
Zeigt die Hilfe für die Befehlszeile an.
Befehle
Befehl |
---|
dotnet-dump collect |
dotnet-dump analyze |
dotnet-dump ps |
dotnet-dump collect
Erfasst ein Speicherabbild von einem Prozess.
Übersicht
dotnet-dump collect [-h|--help] [-p|--process-id] [-n|--name] [--type] [-o|--output] [--diag] [--crashreport]
Optionen
-h|--help
Zeigt die Hilfe für die Befehlszeile an.
-p|--process-id <PID>
Hiermit wird die ID-Nummer des Prozesses angegeben, von dem ein Speicherabbild gesammelt werden soll.
-n|--name <name>
Hiermit wird der Name des Prozesses angegeben, von dem ein Speicherabbild gesammelt werden soll.
--type <Full|Heap|Mini>
Gibt den Speicherabbildtyp an, der festlegt, welche Arten von Informationen vom Prozess gesammelt werden. Es gibt drei Typen:
Full
: Das größte Speicherabbild, das den gesamten Arbeitsspeicher einschließlich der Modulimages enthältHeap
: eine große und relativ umfassende Sicherung, die Modullisten, Threadlisten, alle Stapel, Ausnahmeinformationen, Handleinformationen und den gesamten Arbeitsspeicher mit Ausnahme von zugeordneten Images enthält.Mini
: eine kleine Sicherung, die Modullisten, Threadlisten, Ausnahmeinformationen und alle Stapel enthält.
Wenn nichts anderes angegeben wird, wird als Standard
Full
verwendet.-o|--output <output_dump_path>
Der vollständige Pfad und der Dateiname, in den das gesammelte Speicherabbild geschrieben werden soll. Stellen Sie sicher, dass der Benutzer, unter dem der DotNet-Prozess ausgeführt wird, über Schreibberechtigungen für das angegebene Verzeichnis verfügt.
Wenn nichts angegeben wird, gilt:
- Unter Windows ist der Standard .\dump_JJJJMMTT_HHMMSS.dmp.
- Unter Linux und macOS ist der Standard ./core_JJJJMMTT_HHMMSS.
JJJJMMTT entspricht Jahr/Monat/Tag, und HHMMSS entspricht Stunde/Minute/Sekunde.
--diag
Aktiviert die Diagnoseprotokollierung für die Speicherabbildsammlung.
--crashreport
Aktiviert die Absturzberichtsgenerierung.
Hinweis
Unter Linux und macOS erwartet dieser Befehl, dass die Zielanwendung und dotnet-dump
die gleiche TMPDIR
-Umgebungsvariable verwenden. Andernfalls führt der Befehl zu einem Timeout.
Hinweis
Wenn Sie mit dotnet-dump
ein Speicherabbild erfassen möchten, muss der Befehl vom Rootbenutzer oder dem Benutzer ausgeführt werden, der den Zielprozess ausführt. Andernfalls kann das Tool keine Verbindung mit dem Zielprozess herstellen.
dotnet-dump analyze
Startet eine interaktive Shell zum Durchsuchen eines Speicherabbilds. Die Shell akzeptiert verschiedene SOS-Befehle.
Übersicht
dotnet-dump analyze <dump_path> [-h|--help] [-c|--command]
Argumente
<dump_path>
Gibt den Pfad zu der Speicherabbilddatei an, die analysiert werden soll.
Tastatur
-c|--command <debug_command>
Führt den Befehl beim Start aus. Mehrere Instanzen dieses Parameters können in einem Aufruf zum Verketten von Befehlen verwendet werden. Befehle werden in der Reihenfolge ausgeführt, in der sie in der Befehlszeile bereitgestellt werden. Wenn „dotnet dump“ nach den Befehlen beendet werden soll, muss der letzte Befehl „exit“ lauten.
SOS-Befehle zum Analysieren
Befehl | Funktion |
---|---|
analyzeoom |
Zeigt Informationen zum letzten OOM-Ereignis an, das bei einer Speicherbelegungsanforderung an den Garbage Collection-Heap aufgetreten ist. |
clrmodules |
Listet die verwalteten Module im Prozess auf. |
clrstack |
Stellt eine Stapelüberwachung ausschließlich für verwalteten Code bereit. |
clrthreads |
Listet die verwalteten Threads auf, die ausgeführt werden. |
clru |
Zeigt eine mit Anmerkungen versehene Disassembly einer verwalteten Methode an. |
d oder readmemory |
Sichert Arbeitsspeicherinhalte. |
dbgout |
Aktiviert/deaktiviert (-off ) die interne SOS-Protokollierung. |
dso |
Zeigt alle innerhalb der Grenzen des aktuellen Stapels gefundenen verwalteten Objekte an. |
dumpalc |
Zeigt Details zu einem entladbaren AssemblyLoadContext an, in den das angegebene Objekt geladen wird. |
dumparray |
Zeigt Details zu einem verwalteten Array an. |
dumpasync |
Zeigt Informationen zu Computern im asynchronen Status im Heap der Garbage Collection an. |
dumpassembly |
Zeigt Details zu einer Assembly an. |
dumpclass |
Zeigt Informationen zur EEClass -Struktur bei der angegebenen Adresse an. |
dumpconcurrentdictionary |
Zeigt parallele Wörterbuchinhalte an. |
dumpconcurrentqueue |
Zeigt parallele Warteschlangeninhalte an. |
dumpdelegate |
Zeigt Informationen zu einem Delegaten an. |
dumpdomain |
Zeigt Informationen zu allen Assemblys in allen Anwendungsdomänen oder in der angegebenen Domäne an. |
dumpgcdata |
Zeigt Informationen zu Garbage Collection-Daten an. |
dumpgen |
Zeigt den Heapinhalt für die angegebene Generation an. |
dumpheap |
Zeigt Informationen zum Garbage Collector-Heap und Sammlungsstatistiken zu Objekten an. |
dumpil |
Zeigt die allgemeine Zwischensprache (CIL) an, die einer verwalteten Methode zugeordnet ist. |
dumplog |
Schreibt den Inhalt eines Belastungsprotokolls im Speicher in die angegebene Datei. |
dumpmd |
Zeigt Informationen zu einer MethodDesc -Struktur bei der angegebenen Adresse an |
dumpmodule |
Zeigt Informationen zum Modul bei der angegebenen Adresse an. |
dumpmt |
Zeigt Informationen zur Methodentabelle bei der angegebenen Adresse an. |
dumpobj |
Zeigt Informationen zum Objekt bei der angegebenen Adresse an. |
dumpruntimetypes |
Sucht alle System.RuntimeType-Objekte im Garbage Collection-Heap und gibt den Typnamen und die MethodTable aus, auf die sie verweisen. |
dumpsig |
Sichert die Signatur einer Methode oder eines Felds, die bzw. das durch <sigaddr> <moduleaddr> angegeben wird. |
dumpsigelem |
Sichert ein einzelnes Element eines Signaturobjekts. |
dumpstackobjects |
Zeigt alle innerhalb der Grenzen des aktuellen Stapels gefundenen verwalteten Objekte an. |
dumpvc |
Zeigt Informationen zu den Feldern einer Wertklasse an. |
eeheap |
Zeigt Informationen zu dem von internen Laufzeit-Datenstrukturen verwendeten Prozessspeicher an. |
eestack |
Führt dumpstack für alle Threads im Prozess aus. |
eeversion |
Zeigt Informationen zu den Runtime- und SOS-Versionen an. |
ehinfo |
Zeigt die Ausnahmebehandlungsblöcke in einer angegebenen JIT-Methode an. |
exit oder quit |
Beendet den interaktiven Modus. |
finalizequeue |
Zeigt alle für den Abschluss registrierten Objekte an. |
findappdomain |
Versucht, die Anwendungsdomäne eines Garbage Collection-Objekts aufzulösen. |
gchandles |
Zeigt Statistiken über Garbage Collector-Handles im Prozess an. |
gcheapstat |
Zeigt Statistiken zum Garbage Collector an. |
gcinfo |
Zeigt die JIT-Garbage Collection-Codierung für eine Methode an. |
gcroot |
Zeigt Informationen zu Verweisen auf das Objekt (oder Stämmen) bei der angegebenen Adresse an. |
gcwhere |
Zeigt den Speicherort im Garbage Collection-Heap der angegebenen Adresse an. |
histclear |
Gibt alle von der Familie der Hist-Befehle verwendeten Ressourcen frei. |
histinit |
Initialisiert die SOS-Strukturen aus dem Belastungsprotokoll, die in der zu debuggenden Komponente gespeichert sind. |
histobj |
Untersucht alle Aufzeichnungen von Belastungsprotokollumsetzungen und zeigt die Kette von Garbage Collection-Umsetzungen an, die möglicherweise zu der als Argument übergebenen Adresse geführt haben. |
histobjfind |
Zeigt alle Protokolleinträge an, die auf das Objekt bei der angegebenen Adresse verweisen. |
histroot |
Zeigt Informationen zu sowohl Heraufstufungen als auch Umsetzungen des angegebenen Stamms an. |
histstats |
Zeigt Statistiken zum Belastungsprotokoll an. |
ip2md |
Zeigt die MethodDesc -Struktur bei der angegebenen Adresse in JIT (Just-In-Time)-kompiliertem Code an. |
listnearobj |
Zeigt das Objekt an, das der angegebenen Adresse vorausgeht und darauf folgt. |
logopen |
Aktiviert die Protokollierung der Konsolendatei. |
logclose |
Deaktiviert die Protokollierung der Konsolendatei. |
logging |
Aktiviert/deaktiviert die interne SOS-Protokollierung. |
lm oder modules |
Zeigt die nativen Module im Prozess an. |
name2ee |
Zeigt die Strukturen MethodTable und EEClass für den angegebenen Typ oder die angegebene Methode im angegebenen Modul an. |
objsize |
Zeigt die Größe des angegebenen Objekts an. |
parallelstacks |
Zeigt den zusammengeführten Threadsstapel ähnlich wie im Visual Studio-Bereich „Parallele Stapel“ an. |
pathto |
Zeigt den Garbage Collection-Pfad von <root> zu <target> an. |
pe oder printexception |
Zeigt die Felder jedes Objekts an, das bei der angegebenen Adresse von der Exception-Klasse abgeleitet wird, und formatiert diese Felder. |
r oder registers |
Zeigt die Register des Threads an. |
runtimes |
Listet die Runtimes im Ziel auf oder ändert die Standardruntime. |
setclrpath |
Legt den Pfad zum Laden von CoreCLR-DAC/DBI-Dateien mithilfe von setclrpath <path> fest. |
setsymbolserver |
Aktiviert Unterstützung für den Symbolserver. |
sos |
Führt verschiedene CoreCLR-Debugbefehle aus. Verwenden Sie die Syntax sos <command-name> <args> . Weitere Informationen finden Sie unter „soshelp“. |
soshelp oder help |
Zeigt alle verfügbaren Befehle an. |
soshelp <command> oder help <command> |
Zeigt den angegebenen Befehl an. |
syncblk |
Zeigt die Informationen zum SyncBlock-Container an. |
taskstate |
Zeigt einen Vorgangszustand in einem lesbaren Format an. |
threadpool |
Zeigt Informationen zum Threadpool der Runtime an. |
threadpoolqueue |
Zeigt Arbeitselemente für Threadpools in der Warteschlange an. |
threadstate |
Gibt die Bedeutung eines Threadszustands mit automatischer Strukturierung und Einrückung aus. |
threads <threadid> oder setthread <threadid> |
Legt die ID des aktuellen Threads für die SOS-Befehle fest oder zeigt diese an. |
timerinfo |
Zeigt Informationen zu ausgeführten Timern an. |
token2ee |
Zeigt die MethodTable-Struktur und die MethodDesc-Struktur für das angegebene Token und Modul an. |
traverseheap |
Schreibt Heapinformationen in einem vom CLR-Profiler lesbaren Format in eine Datei. |
verifyheap |
Überprüft den Garbage Collection-Heap auf Anzeichen einer Beschädigung. |
verifyobj |
Überprüft das Objekt, das als Argument für Anzeichen für Beschädigungen übergeben wird. |
Hinweis
Weitere Informationen finden Sie unter SOS-Debuggingerweiterung für .NET.
dotnet-dump ps
Hiermit werden die dotnet-Prozesse aufgelistet, für die Speicherabbilder erfasst werden können.
Ab dotnet-dump
-Version 6.0.320703 werden auch die Befehlszeilenargumente angezeigt, mit denen jeder Prozess gestartet wurde, sofern verfügbar.
Übersicht
dotnet-dump ps [-h|--help]
Beispiel
Angenommen, Sie starten eine zeitintensive App mit dem Befehl dotnet run --configuration Release
. In einem anderen Fenster führen Sie den Befehl dotnet-dump ps
aus. Die Ausgabe sieht wie folgt aus. Sofern vorhanden, werden die Befehlszeilenargumente ab dotnet-dump
-Version 6.0.320703 angezeigt.
> dotnet-dump ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
Verwenden von dotnet-dump
Der erste Schritt besteht im Sammeln eines Speicherabbilds. Dieser Schritt kann übersprungen werden, wenn bereits ein Kernspeicherabbild generiert wurde. Das Betriebssystem und die integrierte Speicherabbild-Generierungsfunktion der .NET Core-Runtime können Kernspeicherabbilder erstellen.
$ dotnet-dump collect --process-id 1902
Writing minidump to file ./core_20190226_135837
Written 98983936 bytes (24166 pages) to core file
Complete
Analysieren Sie nun das Kernspeicherabbild mit dem Befehl analyze
:
$ 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.
>
Durch diese Aktion wird eine interaktive Sitzung aufgerufen, die Befehle wie die folgenden akzeptiert:
> 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]
So zeigen Sie einen Ausnahmefehler an, der Ihre App beendet hat
> 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
Problembehandlung bei der Sammlung von Speicherabbildern
Die Sammlung von Speicherabbildern erfordert, dass der Prozess ptrace
aufgerufen werden kann. Wenn Probleme beim Sammeln von Speicherabbildern auftreten, ist die Ausführungsumgebung möglicherweise so konfiguriert, dass solche Aufrufe eingeschränkt werden. Unter Häufig gestellte Fragen zu Speicherabbildern finden Sie Tipps zur Problembehandlung und mögliche Lösungen für häufige Probleme.