Hilfsprogramm für Liveprozessdebugging und Dumpanalyse (dotnet-debug)

Dieser Artikel bezieht sich auf: ✔️ dotnet-debug Version 0.0.710501 und höhere Versionen

Hinweis

dotnet-debug Unterstützt derzeit nur CoreCLR-basierte Anwendungen und wird derzeit unter macOS nicht unterstützt.

Install

Verwenden Sie zum Installieren der neuesten Releaseversion des dotnet-debug den Befehl dotnet tool install:

dotnet tool install --global dotnet-debug

Zusammenfassung

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

Description

Mit dem dotnet-debug globalen Tool können Sie live .NET-Prozesse anfügen und Dumpdateien interaktiv analysieren. Im Gegensatz dazu dotnet-dump, der schwerpunktmäßig auf Die Dumpsammlung und Offlineanalyse liegt, dotnet-debug ist für die Live-Prozessüberprüfung vorgesehen. Es unterstützt alle gleichen SOS-Debuggingbefehle wie dotnet-dump.

Dieses Tool ist auf Plattformen wie Alpine Linux nützlich, wo eine voll funktionsfähige Funktion lldb nicht verfügbar ist. Das dotnet-debug Tool führt SOS-Befehle aus, um verwalteten Zustand und Heapdiagnose zu analysieren, ist aber kein systemeigener Debugger, sodass das Anzeigen nativer Stapelframes nicht unterstützt wird.

Options

  • --version

    Zeigt die Version des dotnet-debug-Hilfsprogramms an.

  • -h|--help

    Zeigt die Hilfe für die Befehlszeile an.

Befehle

Command
dotnet-debug attach
dotnet-debug open-dump

dotnet-debug attach

Fügt an einen Liveprozess an und startet eine interaktive Shell mit Debuggingbefehlen, um ihn zu erkunden.

Zusammenfassung

dotnet-debug attach <process-id> [-c|--commands <debug_command>] [--accept-license-agreement]

Arguments

  • <process-id>

    Die Prozess-ID zum Anfügen und Analysieren.

Options

  • -c|--commands <debug_command>

    Führt die Befehle 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 Sie nach den Befehlen beenden möchten dotnet-debug , sollte der letzte Befehl sein exit.

  • --accept-license-agreement

    Akzeptiert den Lizenzvertrag ohne Aufforderung.

Example

Anfügen an einen laufenden Prozess mit ID 1234:

$ dotnet-debug attach 1234
Attaching to process: 1234 ...
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.
>

Führen Sie einen Befehl beim Anfügen aus, und beenden Sie dann Folgendes:

dotnet-debug attach 1234 -c clrstack -c exit

dotnet-debug open-dump

Startet eine interaktive Shell mit Debuggingbefehlen, um eine Speicherabbilddatei zu erkunden.

Zusammenfassung

dotnet-debug open-dump <dump_path> [-c|--commands] [--accept-license-agreement]

Arguments

  • <dump_path>

    Der Pfad zur zu analysierenden Speicherabbilddatei.

Options

  • -c|--commands <debug_command>

    Führt die Befehle 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 Sie nach den Befehlen beenden möchten dotnet-debug , sollte der letzte Befehl sein exit.

  • --accept-license-agreement

    Akzeptiert den Lizenzvertrag ohne Aufforderung.

Example

Öffnen und Analysieren einer Speicherabbilddatei:

$ dotnet-debug open-dump ./core_20260209_135837
Loading dump: ./core_20260209_135837 ...
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.
>

Debuggen von SOS-Befehlen

Sowohl die Befehle als attach auch die open-dump Befehle rufen eine interaktive Sitzung auf, die die folgenden SOS-Befehle akzeptiert.

Command 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 zur 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 GC-Heap und druckt den Typnamen und die MethodTable, 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 Stressprotokollverlagerungsdatensätze und zeigt die Kette von Garbage Collection-Verlagerungen 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>. Für weitere Informationen verwenden Sie 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 Debugging Extension für .NET.

Wird dotnet-debug verwendet, um an einen Liveprozess anzufügen

Das folgende Beispiel zeigt, wie Sie an einen ausgeführten .NET-Prozess anfügen und ein Threadpoolproblem untersuchen:

$ dotnet-debug attach 1902
Attaching to process: 1902 ...
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)
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.Program.Foo4(System.String)
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.Program.Foo2(Int32, System.String)
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.Program.Foo1(Int32, System.String)
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.Program.Main(System.String[])

So zeigen Sie eine unbehandelte Ausnahme an:

> 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
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.dll!SymbolTestApp.Program.Foo4(System.String)+0x15d

StackTraceString: <none>
HResult: 80131604

dotnet-debug Vs dotnet-dump

dotnet-debug und dotnet-dump verwenden Sie dieselben SOS-Debuggingbefehle, dienen jedoch verschiedenen primären Zwecken:

Merkmal dotnet-debug dotnet-dump
Anfügen an einen Liveprozess ✔️
Sammeln von Dumps ✔️
Analysieren von Speicherabbilddateien ✔️ ✔️
.NET-Prozesse auflisten (ps) ✔️

Verwenden Sie dotnet-debug diesen Vorgang, wenn Sie einen Liveprozess interaktiv debuggen müssen. Verwenden Sie dotnet-dump diese, wenn Sie Dumps sammeln oder offline analysieren müssen.

Siehe auch