Nástroj pro analýzu a shromažďování výpisu paměti (dotnet-dump)

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

Poznámka:

dotnet-dump pro macOS se podporuje jenom v .NET 5 a novějších verzích.

Instalace

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

Poznámka:

Pokud chcete použít dotnet-dump v aplikaci x86, potřebujete odpovídající verzi nástroje x86.

Synopse

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

Popis

Globální dotnet-dump nástroj představuje způsob, jak shromažďovat a analyzovat výpisy paměti ve Windows, Linuxu a macOS bez jakéhokoli nativního ladicího programu. Tento nástroj je důležitý na platformách, jako je Alpine Linux, kde není k dispozici plně funkční lldb . Nástroj dotnet-dump umožňuje spouštět příkazy SOS pro analýzu chybových ukončení a uvolňování paměti (GC), ale nejedná se o nativní ladicí program, takže se nepodporují věci, jako je zobrazení nativních rámců zásobníku.

Možnosti

  • --version

    Zobrazí verzi nástroje dotnet-dump.

  • -h|--help

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

Příkazy

Příkaz
dotnet-dump collect
dotnet-dump analyze
dotnet-dump ps

dotnet-dump collect

Zachytí výpis z procesu.

Synopse

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

Možnosti

  • -h|--help

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

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

    Určuje číslo ID procesu, ze které se má shromáždit výpis paměti.

  • -n|--name <name>

    Určuje název procesu, ze které se má shromáždit výpis paměti.

  • --type <Full|Heap|Mini>

    Určuje typ výpisu paměti, který určuje typy informací shromážděných z procesu. Existují tři typy:

    • Full - Největší výpis paměti obsahující veškerou paměť včetně imagí modulů.
    • Heap - Velký a relativně komplexní výpis obsahující seznamy modulů, seznamy vláken, všechny zásobníky, informace o výjimce, zpracování informací a veškerou paměť s výjimkou mapovaných obrázků.
    • Mini – Malý výpis paměti obsahující seznamy modulů, seznamy vláken, informace o výjimce a všechny zásobníky.

    Pokud není zadáno, Full je výchozí hodnota.

  • -o|--output <output_dump_path>

    Úplná cesta a název souboru, do kterého se má zapsat shromážděný výpis. Ujistěte se, že uživatel, pod kterým je spuštěný proces dotnet, má oprávnění k zápisu do zadaného adresáře.

    Pokud není zadáno:

    • Výchozí hodnota je .\dump_YYYYMMDD_HHMMSS.dmp ve Windows.
    • Výchozí hodnota je ./core_YYYYMMDD_HHMMSS v Linuxu a macOS.

    YYYYMMDD is Year/Month/Day a HHMMSS is Hour/Minute/Second.

  • --diag

    Povolí protokolování diagnostiky shromažďování výpisů paměti.

  • --crashreport

    Povolí generování zpráv o chybách.

Poznámka:

V Linuxu a macOS tento příkaz očekává cílovou aplikaci a dotnet-dump bude sdílet stejnou proměnnou TMPDIR prostředí. Jinak vyprší časový limit příkazu.

Poznámka:

Pokud chcete shromáždit výpis paměti pomocí dotnet-dump, musí být spuštěný jako stejný uživatel jako uživatel, který spouští cílový proces nebo jako kořen. Jinak se nástroj nepodaří navázat spojení s cílovým procesem.

dotnet-dump analyze

Spustí interaktivní prostředí pro prozkoumání výpisu paměti. Prostředí přijímá různé příkazy SOS.

Synopse

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

Argumenty

  • <dump_path>

    Určuje cestu k souboru s výpisem paměti, který se má analyzovat.

Možnosti

  • -c|--command <debug_command>

    Spustí příkaz 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 spustí v pořadí, v jakém jsou zadané na příkazovém řádku. Pokud chcete po příkazech ukončit výpis paměti dotnet, měl by být poslední příkaz "exit".

Analýza příkazů SOS

Příkaz Function
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 také název typu a MethodTable, 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í zátěžového protokolu a zobrazí řetězec přemísťování uvolňování paměti, který může vést na adresu předanou 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 najdete v tématu "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 rozšíření ladění SOS pro .NET.

dotnet-dump ps

Uvádí seznam procesů dotnet, ze které lze shromažďovat výpisy paměti. dotnet-dump Verze 6.0.320703 a novější verze také zobrazují argumenty příkazového řádku, se kterými byly jednotlivé procesy spuštěny, pokud jsou k dispozici.

Synopse

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

Příklad

Předpokládejme, že spustíte dlouhotrvající aplikaci pomocí příkazu dotnet run --configuration Release. V jiném okně spustíte dotnet-dump ps příkaz. Výstup, který uvidíte, je následující. Argumenty příkazového řádku( pokud existují) se zobrazují ve dotnet-dump verzi 6.0.320703 a novější.

> dotnet-dump ps

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

Používání akce dotnet-dump

Prvním krokem je shromáždění výpisu paměti. Tento krok lze přeskočit, pokud už byl vygenerován výpis paměti jádra. Každý z nich může vytvářet výpisy paměti operačního systému nebo integrované funkce generování výpisu paměti modulu runtime .NET Core.

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

Teď pomocí příkazu analyzujte výpis analyze paměti jádra:

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

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

Zobrazení neošetřené výjimky, která zabila vaši aplikaci:

> 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

Řešení potíží s shromažďováním výpisů paměti

Shromažďování výpisů paměti vyžaduje, aby proces mohl volat ptrace. Pokud máte problémy se shromažďováním výpisů paměti, může být prostředí, na kterém běžíte, nakonfigurované tak, aby tato volání omezovala. Projděte si naše výpisy paměti: Nejčastější dotazy k řešení potíží a potenciální řešení běžných problémů.

Viz také