Udostępnij za pośrednictwem


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-dumpprogramu :

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.

Zobacz też