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
:
dotnet global tool:
Pokud chcete nainstalovat nejnovější verzi
dotnet-dump
balíčku NuGet, použijte příkaz dotnet tool install :dotnet tool install --global dotnet-dump
Přímé stahování:
Stáhněte spustitelný soubor nástroje, který odpovídá vaší platformě:
Operační systém Platforma Windows x86 | x64 | Arm | arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
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ů.