Udostępnij za pośrednictwem


Narzędzie do zbierania i analizy zrzutów (dotnet-dump)

Ten artykuł dotyczy: ✔️ wersja 3.0.47001 lub nowsza

Uwaga

dotnet-dump dla systemu macOS jest obsługiwana tylko w przypadku .NET 5 lub nowszych wersji.

Instalowanie

Istnieją dwa sposoby pobierania i instalowania programu :

  • dotnet global tool (narzędzie globalne dotnet):

    Aby zainstalować najnowszą wersję 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 x86x64ArmArm-x64
    Linuxa x64ArmArm64musl-x64musl-Arm64

Uwaga

Aby korzystać z aplikacji x86, potrzebujesz odpowiedniej wersji narzędzia x86.

Streszczenie

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

opis

Globalne narzędzie dotnet-dump to sposób zbierania i analizowania zrzutów na Windows, Linux i macOS bez udziału natywnego debugera. To narzędzie jest ważne na platformach, takich jak Alpine Linux, gdzie w pełni działające nie jest dostępne. Narzędzie 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 (zbieranie danych)
dotnet-dump analyze (analiza zrzutu donet)
dotnet-dump ps (zrzut kropki)

dotnet-dump collect (zbieranie danych)

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:

    • - Największy zrzut zawierający całą pamięć, w tym obrazy modułu.
    • — 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.
    • - Mały zrzut zawierający listy modułów, listy wątków, informacje o wyjątkach i wszystkie stosy.
    • — Mały zrzut zawierający listy modułów, listy wątków, informacje o wyjątkach, wszystkie stosy i usunięte dane osobowe.

    Jeśli nie zostanie określony, 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 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 będzie współużytkować tę samą zmienną środowiskową. W przeciwnym razie upłynął limit czasu polecenia.

Uwaga

Aby zebrać zrzut przy użyciu polecenia , 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.

Uwaga

Zbieranie pełnego lub zrzutu stertowego może spowodować, że system operacyjny będzie stronicować w znacznej ilości pamięci wirtualnej dla procesu docelowego. Jeśli proces docelowy jest uruchomiony w kontenerze z wymuszonym limitem pamięci, zwiększone użycie pamięci może spowodować przerwanie kontenera przez system operacyjny, jeśli limit został przekroczony. Zalecamy przetestowanie, aby upewnić się, że limit pamięci jest wystarczająco wysoki. Inną opcją jest tymczasowe zmianę lub usunięcie limitu przed usunięciem kolekcji zrzutów, jeśli środowisko to obsługuje.

dotnet-dump analyze (analiza zrzutu donet)

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 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.
lub Zrzuty zawartości pamięci.
dbgout Włącza/wyłącza () 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 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 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 .
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 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.
lub 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 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.
lub Wyświetla moduły natywne w procesie.
name2ee Wyświetla struktury i 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 Visual Studio "Równoległe stosy".
pathto Wyświetla ścieżkę GC z do .
lub Wyświetla i formatuje pola dowolnego obiektu pochodzącego z klasy pod określonym adresem.
lub 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 .
setsymbolserver Włącza obsługę serwera symboli.
sos Wykonuje różne polecenia debugowania coreclr. Użyj składni . Aby uzyskać więcej informacji, zobacz "soshelp".
lub Wyświetla wszystkie dostępne polecenia.
lub 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.
lub 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 SOS Debugowanie rozszerzenia dla .NET.

dotnet-dump ps (zrzut kropki)

Wyświetla listę procesów dotnet, z których można zbierać zrzuty. 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 . W innym oknie uruchomisz polecenie . Dane wyjściowe, które zobaczysz, są następujące. Argumenty wiersza polecenia, jeśli istnieją, są wyświetlane w 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

Pierwszym krokiem jest zebranie zrzutu. Ten krok można pominąć, jeśli został już wygenerowany zrzut rdzenia. System operacyjny lub wbudowana funkcja generowania dump0 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 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

Analizowanie przecieków pamięci i alokacji

Przecieki pamięci występują, gdy aplikacja przechowuje odwołania do obiektów, które nie są już potrzebne, uniemożliwiając odzyskiwanie pamięci przez moduł odśmiecania pamięci. Służy do identyfikowania przecieków pamięci, znajdowania największych obiektów i zrozumienia, gdzie jest zużywana pamięć.

Aby zapoznać się z kompletnym przewodnikiem debugowania przecieku pamięci, zobacz Debug przeciek pamięci w .NET.

Identyfikowanie największych obiektów

Użyj polecenia z opcją , aby wyświetlić podsumowanie obiektów na stercie posortowane według całkowitego rozmiaru:

> dumpheap -stat

Statistics:
              MT    Count    TotalSize Class Name
00007f6c1eeefba8      576        59904 System.Reflection.RuntimeMethodInfo
00007f6c1dc021c8     1749        95696 System.SByte[]
00000000008c9db0     3847       116080      Free
00007f6c1e784a18      175       128640 System.Char[]
00007f6c1dbf5510      217       133504 System.Object[]
00007f6c1dc014c0      467       416464 System.Byte[]
00007f6c21625038        6      4063376 testwebapi.Controllers.Customer[]
00007f6c20a67498   200000      4800000 testwebapi.Controllers.Customer
00007f6c1dc00f90   206770     19494060 System.String
Total 428516 objects

Te dane wyjściowe pokazują, które typy zużywają najwięcej pamięci. W tym przykładzie obiekty zużywają około 19 MB, a obiekty zużywają około 4,8 MB.

Identyfikowanie obiektów według przestrzeni nazw lub zestawu

Aby dowiedzieć się, które moduły lub przestrzenie nazw zużywają pamięć, użyj opcji z częściową nazwą typu, aby filtrować wyniki:

> dumpheap -type MyCompany.Data -stat

Statistics:
              MT    Count    TotalSize Class Name
00007f6c21625038    15000      3600000 MyCompany.Data.CustomerRecord
00007f6c21625040     8000      2560000 MyCompany.Data.OrderHistory
00007f6c21625048     2000       960000 MyCompany.Data.ProductCache
Total 25000 objects, 7120000 bytes

Takie podejście pomaga określić, które części bazy kodu są odpowiedzialne za zużycie pamięci.

Znajdowanie największej liczby wystąpień

Aby sprawdzić, które typy mają najwięcej wystąpień, niezależnie od całkowitego rozmiaru, zapoznaj się z kolumną Count (Liczba ) w danych wyjściowych . Obiekty z dużą liczbą wystąpień mogą wskazywać na nieefektywne problemy z tworzeniem lub buforowaniem obiektów:

> dumpheap -stat

Statistics:
              MT    Count    TotalSize Class Name
00007f6c1dc00f90   206770     19494060 System.String
00007f6c20a67498   200000      4800000 testwebapi.Controllers.Customer
00007f6c1dc021c8     1749        95696 System.SByte[]

W tym przykładzie pokazano 206 770 wystąpień i 200 000 wystąpień.

Analizowanie odwołań do obiektów za pomocą obiektu gcroot

Po zidentyfikowaniu dużych lub licznych obiektów użyj polecenia , aby dowiedzieć się, dlaczego obiekt nie jest wyrzucany bezużytecznie. Polecenie wyświetla łańcuch odwołań z katalogów głównych GC do określonego obiektu:

> dumpheap -mt 00007f6c20a67498
         Address               MT     Size
00007f6ad09421f8 00007f6c20a67498       24
...

> gcroot 00007f6ad09421f8

Thread 3f68:
    00007F6795BB58A0 00007F6C1D7D0745 testwebapi.Controllers.CustomerCache.GetAll()
        rbx:  (interior)
            ->  00007F6BDFFFF038 System.Object[]
            ->  00007F69D0033570 testwebapi.Controllers.Processor
            ->  00007F69D0033588 testwebapi.Controllers.CustomerCache
            ->  00007F69D00335A0 System.Collections.Generic.List`1[[testwebapi.Controllers.Customer]]
            ->  00007F6C000148A0 testwebapi.Controllers.Customer[]
            ->  00007F6AD0942258 testwebapi.Controllers.Customer

Found 1 root.

Te dane wyjściowe pokazują, że obiekt jest przechowywany przez obiekt, co pomaga zidentyfikować źródło wycieku w kodzie.

Analizowanie pamięci według rozmiaru obiektu

Użyj opcji i, aby filtrować obiekty według rozmiaru:

> dumpheap -min 100000 -stat

Statistics:
              MT    Count    TotalSize Class Name
00007f6c21625038        6      4063376 testwebapi.Controllers.Customer[]
00007f6c1dc014c0       12       416464 System.Byte[]
Total 18 objects

To polecenie pokazuje tylko obiekty większe niż 100 000 bajtów, pomagając skupić się na największych odbiorców pamięci.

Znajdowanie zakleszczeń

Służy do diagnozowania sytuacji zakleszczenia, w których wątki są blokowane oczekujące na zasoby. Aby zapoznać się z kompletnym przewodnikiem debugowania zakleszczenia, zobacz Debug zakleszczenia w .NET.

Wyświetlanie listy wszystkich wątków

Użyj polecenia , aby wyświetlić wszystkie zarządzane wątki:

> threads
*0 0x1DBFF (121855)
 1 0x1DC01 (121857)
 2 0x1DC02 (121858)
 ...

Badanie stosów wątków

Użyj polecenia , aby wyświetlić stosy wywołań wszystkich wątków:

> clrstack -all

Poszukaj wzorców, w których wiele wątków jest zablokowanych dla lub podobnych elementów pierwotnych synchronizacji.

Znajdowanie właścicieli blokad

Użyj polecenia , aby zobaczyć, które wątki przechowują blokady i które wątki oczekują:

> syncblk
Index         SyncBlock MonitorHeld Recursion Owning Thread Info          SyncBlock Owner
   43 00000246E51268B8          603         1 0000024B713F4E30 5634  28   00000249654b14c0 System.Object
   44 00000246E5126908            3         1 0000024B713F47E0 51d4  29   00000249654b14d8 System.Object

W kolumnie MonitorHeld jest wyświetlana liczba wątków oczekujących na blokadę. Kolumna Informacje o wątku będące właścicielem pokazuje, który wątek jest właścicielem blokady.

Zaawansowane scenariusze analizy pamięci

Porównanie wielu zrzutów

Aby zrozumieć wzrost pamięci w czasie, zbierz wiele zrzutów i porównaj je:

  1. Zbierz zrzut punktu odniesienia:
  2. Zezwalaj aplikacji na uruchamianie i używanie większej ilości pamięci.
  3. Zbierz drugi zrzut:
  4. Przeanalizuj zrzuty i porównaj wyniki.

Poszukaj typów, które mają znacznie więcej wystąpień lub większe łączne rozmiary w drugim zrzucie.

Analizowanie pamięci dla określonych typów obiektów

Aby zrzucić wszystkie wystąpienia określonego typu:

> dumpheap -type Customer
         Address               MT     Size
00007f6ad09421f8 00007f6c20a67498       24
00007f6ad0942210 00007f6c20a67498       24
...

Następnie użyj polecenia , aby zbadać poszczególne obiekty:

> dumpobj 00007f6ad09421f8
Name:        testwebapi.Controllers.Customer
MethodTable: 00007f6c20a67498
EEClass:     00007f6c21625000
Size:        24(0x18) bytes
File:        /app/testwebapi.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007f6c1dc00f90  4000001        8        System.String  0 instance 00007f6ad09421f0 Name
00007f6c1dbf4c18  4000002       10         System.Int32  1 instance               42 Id

Rozwiązywanie problemów z kolekcją zrzutów

Zbieranie zrzutów wymaga, aby proces mógł wywołać metodę . 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ż

  • Zbieranie i analizowanie zrzutów pamięci — blog
  • Narzędzie do analizy stert (dotnet-gcdump)