Narzędzie do zbierania i analizy zrzutów (dotnet-dump)
Ten artykuł dotyczy: ✔️ dotnet-dump
wersja 3.0.47001 lub nowsza
Uwaga
dotnet-dump
dla systemu macOS jest obsługiwana tylko w przypadku platformy .NET 5 i nowszych wersji.
Instalowanie
Istnieją dwa sposoby pobierania i instalowania dotnet-dump
programu :
dotnet global tool:
Aby zainstalować najnowszą wersję
dotnet-dump
pakietu NuGet, użyj polecenia dotnet tool install :dotnet tool install --global dotnet-dump
Pobieranie bezpośrednie:
Pobierz plik wykonywalny narzędzia pasujący do platformy:
System operacyjny Platforma Windows x86 | x64 | Arm | Arm-x64 Linux x64 Arm | Arm64 | | musl-x64 musl-Arm64 |
Uwaga
Aby korzystać z dotnet-dump
aplikacji x86, potrzebujesz odpowiedniej wersji narzędzia x86.
Streszczenie
dotnet-dump [-h|--help] [--version] <command>
opis
Globalne dotnet-dump
narzędzie to sposób zbierania i analizowania zrzutów w systemach Windows, Linux i macOS bez żadnego natywnego debugera. To narzędzie jest ważne na platformach, takich jak Alpine Linux, gdzie w pełni działające lldb
nie jest dostępne. Narzędzie dotnet-dump
umożliwia uruchamianie poleceń SOS w celu analizowania awarii i modułu odśmiecania pamięci (GC), ale nie jest natywnym debugerem, więc takie elementy jak wyświetlanie natywnych ramek stosu nie są obsługiwane.
Opcje
--version
Wyświetla wersję narzędzia dotnet-dump.
-h|--help
Pokazuje pomoc wiersza polecenia.
Polecenia
Polecenie |
---|
dotnet-dump collect |
dotnet-dump analyze |
dotnet-dump ps |
dotnet-dump collect
Przechwytuje zrzut z procesu.
Streszczenie
dotnet-dump collect [-h|--help] [-p|--process-id] [-n|--name] [--type] [-o|--output] [--diag] [--crashreport]
Opcje
-h|--help
Pokazuje pomoc wiersza polecenia.
-p|--process-id <PID>
Określa numer identyfikatora procesu do zbierania zrzutu.
-n|--name <name>
Określa nazwę procesu do zbierania zrzutu.
--type <Full|Heap|Mini>
Określa typ zrzutu, który określa rodzaje informacji, które są zbierane z procesu. Dostępne są trzy typy kosztów:
Full
- Największy zrzut zawierający całą pamięć, w tym obrazy modułu.Heap
— Duży i stosunkowo kompleksowy zrzut zawierający listy modułów, listy wątków, wszystkie stosy, informacje o wyjątkach, obsługa informacji i wszystkie pamięci z wyjątkiem zamapowanych obrazów.Mini
- Mały zrzut zawierający listy modułów, listy wątków, informacje o wyjątkach i wszystkie stosy.
Jeśli nie zostanie określony,
Full
jest wartością domyślną.-o|--output <output_dump_path>
Pełna ścieżka i nazwa pliku, w którym powinien zostać zapisany zebrany zrzut. Upewnij się, że użytkownik, w ramach którego jest uruchomiony proces dotnet, ma uprawnienia do zapisu w określonym katalogu.
Jeśli nie zostanie określony:
- Wartość domyślna to .\dump_YYYYMMDD_HHMMSS.dmp w systemie Windows.
- Wartość domyślna to ./core_YYYYMMDD_HHMMSS w systemach Linux i macOS.
RRRRDD jest rok/miesiąc/dzień, a HHMMSS to godzina/minuta/sekunda.
--diag
Włącza rejestrowanie diagnostyczne kolekcji zrzutów.
--crashreport
Włącza generowanie raportów o awarii.
Uwaga
W systemach Linux i macOS to polecenie oczekuje aplikacji docelowej i dotnet-dump
będzie współużytkować tę samą TMPDIR
zmienną środowiskową. W przeciwnym razie upłynął limit czasu polecenia.
Uwaga
Aby zebrać zrzut przy użyciu polecenia dotnet-dump
, należy uruchomić go jako ten sam użytkownik, co użytkownik uruchamia proces docelowy lub jako główny. W przeciwnym razie narzędzie nie może nawiązać połączenia z procesem docelowym.
dotnet-dump analyze
Uruchamia interaktywną powłokę w celu eksplorowania zrzutu. Powłoka akceptuje różne polecenia SOS.
Streszczenie
dotnet-dump analyze <dump_path> [-h|--help] [-c|--command]
Argumenty
<dump_path>
Określa ścieżkę do pliku zrzutu do analizy.
Opcje
-c|--command <debug_command>
Uruchamia polecenie podczas uruchamiania. W wywołaniu można użyć wielu wystąpień tego parametru do łączenia poleceń. Polecenia będą uruchamiane w kolejności, w której są udostępniane w wierszu polecenia. Jeśli chcesz, aby zrzut dotnet zakończył się po poleceniach, ostatnie polecenie powinno mieć wartość "exit".
Analizowanie poleceń SOS
Polecenie | Function |
---|---|
analyzeoom |
Przedstawia informacje o ostatnim obiekcie OOM, które wystąpiły w żądaniu alokacji do sterty GC. |
clrmodules |
Wyświetla listę zarządzanych modułów w procesie. |
clrstack |
Dostarcza ślad stosu wyłącznie dla kodu zarządzanego. |
clrthreads |
Wyświetla listę zarządzanych wątków, które są uruchomione. |
clru |
Wyświetla adnotację dezasemblacji metody zarządzanej. |
d lub readmemory |
Zrzuty zawartości pamięci. |
dbgout |
Włącza/wyłącza (-off ) wewnętrzne rejestrowanie SOS. |
dso |
Wyświetla wszystkie zarządzane obiekty znalezione w granicach bieżącego stosu. |
dumpalc |
Wyświetla szczegółowe informacje o zbieralnym obiekcie AssemblyLoadContext, do którego załadowano określony obiekt. |
dumparray |
Wyświetla szczegółowe informacje o tablicy zarządzanej. |
dumpasync |
Wyświetla informacje o maszynach stanu asynchronicznego na stercie zbieranym przez śmieci. |
dumpassembly |
Wyświetla szczegółowe informacje o zestawie. |
dumpclass |
Wyświetla informacje o EEClass strukturze pod określonym adresem. |
dumpconcurrentdictionary |
Wyświetla współbieżną zawartość słownika. |
dumpconcurrentqueue |
Wyświetla współbieżną zawartość kolejki. |
dumpdelegate |
Wyświetla informacje o pełnomocniku. |
dumpdomain |
Wyświetla informacje o wszystkich zestawach we wszystkich domenach aplikacji lub określonym. |
dumpgcdata |
Wyświetla informacje o danych GC. |
dumpgen |
Wyświetla zawartość stert dla określonej generacji. |
dumpheap |
Wyświetla informacje o stosie zbieranym przez śmieci i statystykach zbierania danych dotyczących obiektów. |
dumpil |
Wyświetla wspólny język pośredni (CIL) skojarzony z metodą zarządzaną. |
dumplog |
Zapisuje zawartość dziennika obciążenia pamięci do określonego pliku. |
dumpmd |
Wyświetla informacje o MethodDesc strukturze pod określonym adresem. |
dumpmodule |
Wyświetla informacje o module pod określonym adresem. |
dumpmt |
Wyświetla informacje o tabeli metod pod określonym adresem. |
dumpobj |
Wyświetla informacje o obiekcie pod określonym adresem. |
dumpruntimetypes |
Znajduje wszystkie obiekty System.RuntimeType na stercie GC i wyświetla nazwę typu i metodę MethodTable, do których się odwołują. |
dumpsig |
Zrzuty sygnatury metody lub pola określonego przez <sigaddr> <moduleaddr> . |
dumpsigelem |
Zrzuty pojedynczego elementu obiektu podpisu. |
dumpstackobjects |
Wyświetla wszystkie zarządzane obiekty znalezione w granicach bieżącego stosu. |
dumpvc |
Wyświetla informacje o polach klasy wartości. |
eeheap |
Wyświetla informacje o pamięci procesów używanej przez wewnętrzne struktury danych środowiska uruchomieniowego. |
eestack |
Uruchamia wszystkie dumpstack wątki w procesie. |
eeversion |
Wyświetla informacje o wersjach środowiska uruchomieniowego i SOS. |
ehinfo |
Wyświetla bloki obsługi wyjątków w metodzie JIT-ed. |
exit lub quit |
Zamyka tryb interaktywny. |
finalizequeue |
Wyświetla wszystkie obiekty zarejestrowane dla finalizacji. |
findappdomain |
Próbuje rozpoznać domenę AppDomain obiektu GC. |
gchandles |
Wyświetla statystyki dotyczące uchwytów modułu odśmiecania pamięci w procesie. |
gcheapstat |
Wyświetla statystyki dotyczące modułu odśmiecającego śmieci. |
gcinfo |
Wyświetla kodowanie GC JIT dla metody . |
gcroot |
Wyświetla informacje o odwołaniach (lub korzeniach) do obiektu pod określonym adresem. |
gcwhere |
Wyświetla lokalizację na stercie GC określonego adresu. |
histclear |
Zwalnia wszelkie zasoby używane przez rodzinę poleceń Hist. |
histinit |
Inicjuje struktury SOS z dziennika obciążenia zapisanego w obiekcie debugowanym. |
histobj |
Sprawdza wszystkie rekordy przeniesienia dziennika obciążenia i wyświetla łańcuch przeniesień modułu odśmiecania pamięci, które mogły doprowadzić do adresu przekazanego jako argument. |
histobjfind |
Wyświetla wszystkie wpisy dziennika odwołujące się do obiektu pod określonym adresem. |
histroot |
Wyświetla informacje powiązane zarówno z promocjami, jak i przeniesieniami określonego korzenia. |
histstats |
Wyświetla statystyki dziennika obciążenia. |
ip2md |
MethodDesc Wyświetla strukturę na określonym adresie w kodzie, który został skompilowany w trybie JIT. |
listnearobj |
Wyświetla obiekt poprzedzający i udany określony adres. |
logopen |
Włącza rejestrowanie plików konsoli. |
logclose |
Wyłącza rejestrowanie plików konsoli. |
logging |
Włącza/wyłącza wewnętrzne rejestrowanie SOS. |
lm lub modules |
Wyświetla moduły natywne w procesie. |
name2ee |
MethodTable Wyświetla struktury i EEClass dla określonego typu lub metody w określonym module. |
objsize |
Wyświetla rozmiar określonego obiektu. |
parallelstacks |
Wyświetla scalony stos wątków podobnie jak w panelu "Równoległe stosy" programu Visual Studio. |
pathto |
Wyświetla ścieżkę GC z <root> do <target> . |
pe lub printexception |
Wyświetla i formatuje pola dowolnego obiektu pochodzącego z Exception klasy pod określonym adresem. |
r lub registers |
Wyświetla rejestry wątku. |
runtimes |
Wyświetla listę środowisk uruchomieniowych w obiekcie docelowym lub zmienia domyślne środowisko uruchomieniowe. |
setclrpath |
Ustawia ścieżkę do ładowania plików coreclr dac/dbi przy użyciu polecenia setclrpath <path> . |
setsymbolserver |
Włącza obsługę serwera symboli. |
sos |
Wykonuje różne polecenia debugowania coreclr. Użyj składni sos <command-name> <args> . Aby uzyskać więcej informacji, zobacz "soshelp". |
soshelp lub help |
Wyświetla wszystkie dostępne polecenia. |
soshelp <command> lub help <command> |
Wyświetla określone polecenie. |
syncblk |
Wyświetla informacje o posiadaczu elementu SyncBlock. |
taskstate |
Wyświetla stan zadania w formacie czytelnym dla człowieka. |
threadpool |
Wyświetla informacje o puli wątków środowiska uruchomieniowego. |
threadpoolqueue |
Wyświetla elementy robocze puli wątków w kolejce. |
threadstate |
Dość drukuje znaczenie stanu wątków. |
threads <threadid> lub setthread <threadid> |
Ustawia lub wyświetla bieżący identyfikator wątku dla poleceń SOS. |
timerinfo |
Wyświetla informacje o uruchomionych czasomierzach. |
token2ee |
Przedstawia strukturę MethodTable i strukturę MethodDesc dla określonego tokenu i modułu. |
traverseheap |
Zapisuje informacje stertowe do pliku w formacie zrozumiałym dla CLR Profiler. |
verifyheap |
Sprawdza stertę GC pod kątem oznak uszkodzenia. |
verifyobj |
Sprawdza, czy obiekt, który jest przekazywany jako argument posiada oznaki uszkodzenia. |
Uwaga
Dodatkowe szczegóły można znaleźć w rozszerzeniu debugowania SOS dla platformy .NET.
dotnet-dump ps
Wyświetla listę procesów dotnet, z których można zbierać zrzuty.
dotnet-dump
W wersji 6.0.320703 i nowszych wersjach są również wyświetlane argumenty wiersza polecenia, z którymi uruchomiono każdy proces, jeśli jest dostępny.
Streszczenie
dotnet-dump ps [-h|--help]
Przykład
Załóżmy, że uruchamiasz długotrwałą aplikację przy użyciu polecenia dotnet run --configuration Release
. W innym oknie uruchomisz dotnet-dump ps
polecenie . Dane wyjściowe, które zobaczysz, są następujące. Argumenty wiersza polecenia, jeśli istnieją, są wyświetlane w dotnet-dump
wersji 6.0.320703 lub nowszej.
> dotnet-dump ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
Korzystanie z akcji dotnet-dump
Pierwszym krokiem jest zebranie zrzutu. Ten krok można pominąć, jeśli został już wygenerowany zrzut rdzenia. Wbudowany system operacyjny lub wbudowana funkcja generowania zrzutów środowiska uruchomieniowego platformy .NET Core może tworzyć zrzuty podstawowe.
$ dotnet-dump collect --process-id 1902
Writing minidump to file ./core_20190226_135837
Written 98983936 bytes (24166 pages) to core file
Complete
Teraz przeanalizuj zrzut rdzeni za analyze
pomocą polecenia :
$ 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.
>
Ta akcja powoduje wyświetlenie interaktywnej sesji, która akceptuje polecenia, takie jak:
> 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]
Aby wyświetlić nieobsługiwany wyjątek, który zabił aplikację:
> 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
Rozwiązywanie problemów z kolekcją zrzutów
Zbieranie zrzutów wymaga, aby proces mógł wywołać metodę ptrace
. Jeśli masz problemy ze zbieraniem zrzutów, środowisko, na którym działasz, może być skonfigurowane tak, aby ograniczyć takie wywołania. Zobacz nasze zrzuty: często zadawane pytania , aby uzyskać porady dotyczące rozwiązywania problemów i potencjalne rozwiązania typowych problemów.