Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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-dumpPobieranie 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
--versionWyświetla wersję narzędzia dotnet-dump.
-h|--helpPokazuje 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|--helpPokazuje 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.
--diagWłącza rejestrowanie diagnostyczne kolekcji zrzutów.
--crashreportWłą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
$ 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:
- Zbierz zrzut punktu odniesienia:
- Zezwalaj aplikacji na uruchamianie i używanie większej ilości pamięci.
- Zbierz drugi zrzut:
- 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)