Sdílet prostřednictvím


Ladění živého procesu a nástroj pro analýzu výpisu paměti (dotnet-debug)

Tento článek se vztahuje na: ✔️ dotnet-debug verze 0.0.710501 a novější verze

Poznámka:

dotnet-debug v současné době podporuje pouze aplikace založené na CoreCLR a v současné době se v macOS nepodporuje.

Install

Existují dva způsoby, jak stáhnout a nainstalovat dotnet-debug:

Přehled

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

Description

Globální dotnet-debug nástroj umožňuje připojit se k živým procesům .NET a interaktivně analyzovat soubory výpisu paměti. Na rozdíl od dotnet-dumptoho, který se zaměřuje na shromažďování výpisů paměti a offline analýzu, dotnet-debug je určen pro kontrolu živého procesu. Podporuje všechny stejné příkazy ladění SOS jako dotnet-dump.

Tento nástroj je užitečný na platformách, jako je Alpine Linux, kde není k dispozici plně funkční lldb . Nástroj dotnet-debug spouští příkazy SOS pro analýzu spravovaného stavu a diagnostiky haldy, ale nejedná se o nativní ladicí program, takže zobrazení nativních rámců zásobníku není podporované.

Možnosti

  • --version

    Zobrazí verzi nástroje dotnet-debug.

  • -h|--help

    Zobrazuje nápovědu k příkazovému řádku.

Commands

Command
dotnet-debug attach
dotnet-debug open-dump

dotnet-debug attach

Připojí se k živému procesu a spustí interaktivní prostředí s příkazy ladění, které ho prozkoumá.

Přehled

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

Arguments

  • <process-id>

    ID procesu pro připojení a analýzu.

Možnosti

  • -c|--commands <debug_command>

    Spustí příkazy při spuštění. Více instancí tohoto parametru lze použít při vyvolání ke zřetězování příkazů. Příkazy se spouští v pořadí, v jakém jsou k dispozici na příkazovém řádku. Pokud chcete dotnet-debug po příkazech ukončit, měl by být exitposlední příkaz .

  • --accept-license-agreement

    Přijímá licenční smlouvu bez výzvy.

Example

Připojte se ke spuštěném procesu s 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.
>

Spusťte příkaz při připojení a ukončete:

dotnet-debug attach 1234 -c clrstack -c exit

dotnet-debug open-dump

Spustí interaktivní prostředí s příkazy ladění pro prozkoumání souboru s výpisem paměti.

Přehled

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

Arguments

  • <dump_path>

    Cesta k souboru s výpisem paměti k analýze.

Možnosti

  • -c|--commands <debug_command>

    Spustí příkazy při spuštění. Více instancí tohoto parametru lze použít při vyvolání ke zřetězování příkazů. Příkazy se spouští v pořadí, v jakém jsou k dispozici na příkazovém řádku. Pokud chcete dotnet-debug po příkazech ukončit, měl by být exitposlední příkaz .

  • --accept-license-agreement

    Přijímá licenční smlouvu bez výzvy.

Example

Otevřete a analyzujte soubor s výpisem paměti:

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

Ladění příkazů SOS

Příkazy attach i open-dump příkazy zobrazí interaktivní relaci, která přijímá následující příkazy SOS.

Command Funkce
analyzeoom Zobrazí informace o posledním objektu OOM, ke kterému došlo v žádosti o přidělení haldy GC.
clrmodules Zobrazí seznam spravovaných modulů v procesu.
clrstack Poskytne trasování zásobníku pouze pro spravovaný kód.
clrthreads Zobrazí seznam spravovaných vláken, která jsou spuštěná.
clru Zobrazí anotovaný překlad spravované metody.
d nebo readmemory Vypíše obsah paměti.
dbgout Povolí nebo zakáže (-off) interní protokolování SOS.
dso Zobrazí všechny spravované objekty nalezené v rámci aktuálního zásobníku.
dumpalc Zobrazí podrobnosti o collectible AssemblyLoadContext, do kterého je zadaný objekt načten.
dumparray Zobrazí podrobnosti o spravovaném poli.
dumpasync Zobrazí informace o asynchronních stavových počítačích na haldě s uvolňováním paměti.
dumpassembly Zobrazí podrobnosti o sestavení.
dumpclass Zobrazí informace o struktuře EEClass na zadané adrese.
dumpconcurrentdictionary Zobrazí souběžný obsah slovníku.
dumpconcurrentqueue Zobrazí souběžný obsah fronty.
dumpdelegate Zobrazí informace o delegátu.
dumpdomain Zobrazí informace o všech sestaveních ve všech doménách AppDomains nebo zadaném sestavení.
dumpgcdata Zobrazí informace o datech GC.
dumpgen Zobrazí obsah haldy pro zadanou generaci.
dumpheap Zobrazí informace o statistikách haldy a shromažďování paměti o objektech.
dumpil Zobrazí běžný zprostředkující jazyk (CIL), který je přidružený ke spravované metodě.
dumplog Zapíše obsah zátěžového protokolu uloženého v paměti do zadaného souboru.
dumpmd Zobrazí informace o struktuře MethodDesc na zadané adrese.
dumpmodule Zobrazí informace o modulu na zadané adrese.
dumpmt Zobrazí informace o tabulce metod na zadané adrese.
dumpobj Zobrazí informace o objektu na zadané adrese.
dumpruntimetypes Vyhledá všechny objekty System.RuntimeType v haldě GC a vytiskne název typu a MethodTable, na které odkazují.
dumpsig Vypisuje podpis metody nebo pole určeného parametrem <sigaddr> <moduleaddr>.
dumpsigelem Vypisuje jeden prvek objektu podpisu.
dumpstackobjects Zobrazí všechny spravované objekty nalezené v rámci aktuálního zásobníku.
dumpvc Zobrazí informace o polích třídy hodnot.
eeheap Zobrazí informace o paměti procesu spotřebované interními datovými strukturami modulu runtime.
eestack Spouští dumpstack se na všech vláknech v procesu.
eeversion Zobrazí informace o modulech runtime a verzích SOS.
ehinfo Zobrazí bloky zpracování výjimek v metodě jit-ed.
exit nebo quit Ukončí interaktivní režim.
finalizequeue Zobrazí všechny objekty, které jsou registrovány pro dokončení.
findappdomain Pokusí se přeložit AppDomain objektu GC.
gchandles Zobrazí statistické údaje o popisovačích systému uvolňování paměti v procesu.
gcheapstat Zobrazí statistiku o uvolňování paměti.
gcinfo Zobrazí kódování GC JIT pro metodu.
gcroot Zobrazí informace o odkazech (nebo kořenech) objektu na zadané adrese.
gcwhere Zobrazí umístění v haldě GC zadané adresy.
histclear Uvolní všechny prostředky používané rodinou příkazů Hist.
histinit Inicializuje struktury SOS ze zátěžového protokolu uloženého v laděné položce.
histobj Zkontroluje všechny záznamy přemístění protokolu zatížení a zobrazí řetězec přemístění uvolňování paměti, které mohly vést k adrese předané jako argument.
histobjfind Zobrazí všechny položky protokolu, které odkazují na objekt na zadané adrese.
histroot Zobrazí informace týkající se propagace a přemístění zadaného kořenu.
histstats Zobrazí statistiky protokolu napětí.
ip2md MethodDesc Zobrazí strukturu na zadané adrese v kódu, který byl zkompilován JIT.
listnearobj Zobrazí objekt, který předchází zadané adrese a bude úspěšný.
logopen Povolí protokolování souborů konzoly.
logclose Zakáže protokolování souborů konzoly.
logging Povolí nebo zakáže interní protokolování SOS.
lm nebo modules Zobrazí nativní moduly v procesu.
name2ee MethodTable Zobrazí a EEClass struktury pro zadaný typ nebo metodu v zadaném modulu.
objsize Zobrazí velikost zadaného objektu.
parallelstacks Zobrazí zásobník sloučených vláken podobně jako na panelu Paralelní zásobníky sady Visual Studio.
pathto Zobrazí cestu GC od <root> do <target>.
pe nebo printexception Zobrazí a formátuje pole libovolného objektu Exception odvozeného z třídy na zadané adrese.
r nebo registers Zobrazí registry vlákna.
runtimes Zobrazí seznam modulů runtime v cíli nebo změní výchozí modul runtime.
setclrpath Nastaví cestu pro načtení souborů dac/dbi coreclr pomocí setclrpath <path>.
setsymbolserver Povolí podporu serveru symbolů.
sos Spustí různé příkazy ladění coreclr. Použijte syntaxi sos <command-name> <args>. Další informace potřebujete.soshelp
soshelp nebo help Zobrazí všechny dostupné příkazy.
soshelp <command> nebo help <command> Zobrazí zadaný příkaz.
syncblk Zobrazí informace o držiteli syncblocku.
taskstate Zobrazí stav úkolu v čitelném formátu člověka.
threadpool Zobrazí informace o fondu vláken modulu runtime.
threadpoolqueue Zobrazí pracovní položky fondu vláken ve frontě.
threadstate Docela vytiskne význam stavu vláken.
threads <threadid> nebo setthread <threadid> Nastaví nebo zobrazí aktuální ID vlákna pro příkazy SOS.
timerinfo Zobrazí informace o spuštěných časovačích.
token2ee Zobrazí strukturu MethodTable a strukturu MethodDesc pro zadaný token a modul.
traverseheap Zapíše informace haldy do souboru ve formátu, kterému rozumí profiler CLR.
verifyheap Zkontroluje známky poškození haldy GC.
verifyobj Zkontroluje, zda objekt, který je předán jako argument, jeví známky poškození.

Poznámka:

Další podrobnosti najdete v tématu Rozšíření ladění SOS pro .NET.

Slouží dotnet-debug k připojení k živému procesu.

Následující příklad ukazuje, jak připojit ke spuštěném procesu .NET a prozkoumat problém s fondem vláken:

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

Tato akce zobrazí interaktivní relaci, která přijímá příkazy jako:

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

Zobrazení neošetřené výjimky:

> 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 versus dotnet-dump

dotnet-debug a dotnet-dump sdílejte stejné příkazy ladění SOS, ale slouží různým primárním účelům:

Vlastnost dotnet-debug dotnet-dump
Připojení k živému procesu ✔️
Shromažďování výpisů paměti ✔️
Analýza souborů s výpisem paměti ✔️ ✔️
Výpis procesů .NET (ps) ✔️

Použijte dotnet-debug , když potřebujete interaktivně ladit živý proces. Použijte dotnet-dump , když potřebujete shromáždit výpisy paměti nebo je analyzovat offline.

Viz také