Narzędzie do debugowania i analizowania zrzutów na żywo (dotnet-debug)

Ten artykuł dotyczy: ✔️ dotnet-debug wersja 0.0.710501 lub nowsza

Uwaga / Notatka

dotnet-debug obecnie obsługuje tylko aplikacje oparte na technologii CoreCLR i nie są obecnie obsługiwane w systemie macOS.

Install

Aby zainstalować najnowszą wersję dotnet-debugpakietu NuGet, użyj polecenia dotnet tool install :

dotnet tool install --global dotnet-debug

Streszczenie

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

Description

Narzędzie dotnet-debug globalne umożliwia dołączanie do dynamicznych procesów platformy .NET i interaktywne analizowanie plików zrzutu. W przeciwieństwie do dotnet-dumpmetody , która koncentruje się na zbieraniu zrzutów i analizie offline, dotnet-debug jest przeznaczona do inspekcji procesów na żywo. Obsługuje wszystkie te same polecenia debugowania SOS co dotnet-dump.

To narzędzie jest przydatne na platformach, takich jak Alpine Linux, gdzie w pełni działające lldb nie jest dostępne. Narzędzie dotnet-debug uruchamia polecenia SOS do analizowania stanu zarządzanego i diagnostyki sterty, ale nie jest natywnym debugerem, więc wyświetlanie natywnych ramek stosu nie jest obsługiwane.

Opcje

  • --version

    Wyświetla wersję narzędzia dotnet-debug.

  • -h|--help

    Pokazuje pomoc wiersza polecenia.

Commands

Command
dotnet-debug attach
dotnet-debug open-dump

dotnet-debug attach

Dołącza do procesu na żywo i uruchamia interaktywną powłokę z poleceniami debugowania, aby go eksplorować.

Streszczenie

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

Arguments

  • <process-id>

    Identyfikator procesu do dołączania i analizowania.

Opcje

  • -c|--commands <debug_command>

    Uruchamia polecenia podczas uruchamiania. W wywołaniu można użyć wielu wystąpień tego parametru do łączenia poleceń. Polecenia są uruchamiane w kolejności, w której są udostępniane w wierszu polecenia. Jeśli chcesz dotnet-debug zakończyć działanie po poleceniach, ostatnie polecenie powinno mieć wartość exit.

  • --accept-license-agreement

    Akceptuje umowę licencyjną bez monitowania.

Example

Dołącz do uruchomionego procesu o identyfikatorze 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.
>

Uruchom polecenie przy dołączaniu, a następnie zamknij:

dotnet-debug attach 1234 -c clrstack -c exit

dotnet-debug open-dump

Uruchamia interaktywną powłokę z poleceniami debugowania w celu eksplorowania pliku zrzutu.

Streszczenie

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

Arguments

  • <dump_path>

    Ścieżka do pliku zrzutu do analizy.

Opcje

  • -c|--commands <debug_command>

    Uruchamia polecenia podczas uruchamiania. W wywołaniu można użyć wielu wystąpień tego parametru do łączenia poleceń. Polecenia są uruchamiane w kolejności, w której są udostępniane w wierszu polecenia. Jeśli chcesz dotnet-debug zakończyć działanie po poleceniach, ostatnie polecenie powinno mieć wartość exit.

  • --accept-license-agreement

    Akceptuje umowę licencyjną bez monitowania.

Example

Otwórz i przeanalizuj plik zrzutu:

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

Debugowanie poleceń SOS

attach Polecenia i open-dump wyświetlają interaktywną sesję, która akceptuje następujące polecenia SOS.

Command Funkcja
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 relokacji dziennika stresu i wyświetla łańcuch relokacji odzyskiwania pamięci, które mogły prowadzić 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, użyj polecenia 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 / Notatka

Aby uzyskać więcej informacji, zobacz Rozszerzenie debugowania SOS dla platformy .NET.

Użyj dotnet-debug polecenia , aby dołączyć do procesu na żywo

W poniższym przykładzie pokazano, jak dołączyć do uruchomionego procesu platformy .NET i zbadać problem z pulą wątków:

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

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

Aby wyświetlić nieobsługiwany wyjątek:

> 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

Klasa dotnet-debug a klasa dotnet-dump

dotnet-debug i dotnet-dump współużytkują te same polecenia debugowania SOS, ale służą różnym celom podstawowym:

Funkcja dotnet-debug dotnet-dump
Dołączanie do procesu na żywo ✔️
Zbieranie zrzutów ✔️
Analizowanie plików zrzutu ✔️ ✔️
Wyświetlanie listy procesów platformy .NET (ps) ✔️

Użyj dotnet-debug polecenia , aby debugować proces na żywo interaktywnie. Użyj dotnet-dump polecenia , gdy musisz zebrać zrzuty lub przeanalizować je w trybie offline.

Zobacz także