Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makale şunlar için geçerlidir: ✔️ dotnet-dump sürüm 3.0.47001 ve sonraki sürümler
Not
macOS için dotnet-dump yalnızca .NET 5 ve üzeri sürümlerde desteklenir.
Yükleme
İndirmenin ve yüklemenin dotnet-dumpiki yolu vardır:
dotnet genel aracı:
NuGet paketinin en son sürüm sürümünü
dotnet-dumpyüklemek için dotnet tool install komutunu kullanın:dotnet tool install --global dotnet-dumpDoğrudan indirme:
Platformunuzla eşleşen araç yürütülebilir dosyasını indirin:
işletim sistemi Platforma Windows x86 | x64 | Arm | Arm-x64 Linux işletim sistemi x64 | Kol | Arm64 | musl-x64 | musl-Arm64
Not
Bir x86 uygulamasında kullanmak dotnet-dump için aracın ilgili x86 sürümünü kullanmanız gerekir.
Özet
dotnet-dump [-h|--help] [--version] <command>
Açıklama
dotnet-dump genel aracı, Windows, Linux ve macOS'ta yerel hata ayıklayıcı içermeyen dökümleri toplamanın ve analiz etmenin bir yoludur. Bu araç, tam olarak çalışan lldb bir sürümün kullanılamadığı Alpine Linux gibi platformlarda önemlidir. Araç, dotnet-dump kilitlenmeleri ve çöp toplayıcıyı (GC) analiz etmek için SOS komutlarını çalıştırmanıza olanak tanır, ancak yerel bir hata ayıklayıcı olmadığından yerel yığın çerçevelerini görüntüleme gibi işlemler desteklenmez.
Seçenekler
--versiondotnet-dump yardımcı programının sürümünü görüntüler.
-h|--helpKomut satırı yardımlarını gösterir.
Komutlar
| Komut |
|---|
| dotnet-dump toplama |
| dotnet-dump çözümle |
| dotnet-dump ps |
dotnet-dump toplama
Bir işlemden dökümü yakalar.
Özet
dotnet-dump collect [-h|--help] [-p|--process-id] [-n|--name] [--type] [-o|--output] [--diag] [--crashreport]
Seçenekler
-h|--helpKomut satırı yardımlarını gösterir.
-p|--process-id <PID>Dökümü toplayacak işlem kimliği numarasını belirtir.
-n|--name <name>Dökümü toplayacak işlemin adını belirtir.
--type <Full|Heap|Mini>İşlemden toplanan bilgi türlerini belirleyen döküm türünü belirtir. Üç tür kur vardır:
-
Full- Modül görüntüleri dahil olmak üzere tüm belleği içeren en büyük döküm. -
Heap- Modül listelerini, iş parçacığı listelerini, tüm yığınları, özel durum bilgilerini, işleme bilgilerini ve eşlenen görüntüler dışındaki tüm belleği içeren büyük ve nispeten kapsamlı bir döküm. -
Mini- Modül listelerini, iş parçacığı listelerini, özel durum bilgilerini ve tüm yığınları içeren küçük bir döküm. -
Triage- Modül listelerini, iş parçacığı listelerini, özel durum bilgilerini, tüm yığınları ve PII'yi içeren küçük bir döküm kaldırıldı.
Belirtilmezse,
Fullvarsayılan değerdir.-
-o|--output <output_dump_path>Toplanan dökümü yazılması gereken tam yol ve dosya adı. dotnet işleminin çalıştığı kullanıcının belirtilen dizine yazma izinlerine sahip olduğundan emin olun.
Belirtilmezse:
- Varsayılan olarak Windows .\dump_YYYYMMDD_HHMMSS.dmp olarak değiştirilir.
- Linux ve macOS'ta varsayılan olarak ./core_YYYYMMDD_HHMMSS değeridir.
YYYYMMDD Yıl/Ay/Gün, HHMMSS ise Saat/Dakika/Saniyedir.
--diagDöküm toplama tanılama günlüğünü etkinleştirir.
--crashreportKilitlenme raporu oluşturmayı etkinleştirir.
Not
Linux ve macOS'ta bu komut hedef uygulamanın ve dotnet-dump aynı TMPDIR ortam değişkenini paylaşmasını bekler. Aksi takdirde, komut zaman aşımına uğradı.
Not
kullanarak dotnet-dumpdöküm toplamak için, hedef işlemi çalıştıran kullanıcıyla aynı kullanıcı olarak veya kök olarak çalıştırılması gerekir. Aksi takdirde araç hedef işlemle bağlantı kuramaz.
Not
Tam veya yığın dökümü toplamak, işletim sisteminin hedef işlem için önemli bir sanal bellekte sayfalamasına neden olabilir. Hedef işlem zorunlu bellek sınırı olan bir kapsayıcıda çalışıyorsa, artan bellek kullanımı sınırı aşıldığında işletim sisteminin kapsayıcıyı sonlandırmasına neden olabilir. Bellek sınırının yeterince yüksek ayarlandığından emin olmak için test yapmanızı öneririz. Bir diğer seçenek de, ortamınız bunu destekliyorsa döküm toplamadan önce sınırı geçici olarak değiştirmek veya kaldırmaktır.
dotnet-dump çözümle
Dökümü keşfetmek için etkileşimli bir kabuk başlatır. Kabuk çeşitli SOS komutlarını kabul eder.
Özet
dotnet-dump analyze <dump_path> [-h|--help] [-c|--command]
Bağımsız değişkenler
<dump_path>Analiz etmek için döküm dosyasının yolunu belirtir.
Seçenekler
-c|--command <debug_command>Komutu başlangıçta çalıştırır. Komutları zincirleme çağrısında bu parametrenin birden çok örneği kullanılabilir. Komutlar, komut satırında sağlandığı sırayla çalıştırılır. Komutlar sonrasında dotnet dökümü çıkılmasını istiyorsanız, son komutunuz 'exit' olmalıdır.
SOS komutlarını analiz etme
| Komut | İşlev |
|---|---|
analyzeoom |
GC yığınına bir ayırma isteğinde gerçekleşen son OOM'un bilgilerini görüntüler. |
clrmodules |
İşlemdeki yönetilen modülleri listeler. |
clrstack |
Yalnızca bir yönetilen kodların bir yığın izlemesini sağlar. |
clrthreads |
Çalışan yönetilen iş parçacıklarını listeler. |
clru |
Yönetilen yöntemin açıklamalı bir ayrıştırma durumunu görüntüler. |
d veya readmemory |
Bellek içeriğinin dökümünü alır. |
dbgout |
İç SOS günlüğünü etkinleştirir/devre dışı bırakır-off. |
dso |
Geçerli yığının sınırları içinde bulunan tüm yönetilen nesneleri görüntüler. |
dumpalc |
Belirtilen nesnenin yüklendiği collectible AssemblyLoadContext hakkındaki ayrıntıları görüntüler. |
dumparray |
Yönetilen dizi hakkındaki ayrıntıları görüntüler. |
dumpasync |
Atık olarak toplanan yığındaki zaman uyumsuz durum makineleri hakkındaki bilgileri görüntüler. |
dumpassembly |
Derlemeyle ilgili ayrıntıları görüntüler. |
dumpclass |
Belirtilen adreste EEClass yapı hakkındaki bilgileri görüntüler. |
dumpconcurrentdictionary |
Eşzamanlı sözlük içeriğini görüntüler. |
dumpconcurrentqueue |
Eşzamanlı kuyruk içeriğini görüntüler. |
dumpdelegate |
Temsilci hakkındaki bilgileri görüntüler. |
dumpdomain |
Tüm AppDomains veya belirtilen içindeki tüm derlemeler hakkındaki bilgileri görüntüler. |
dumpgcdata |
GC verileri hakkındaki bilgileri görüntüler. |
dumpgen |
Belirtilen nesil için yığın içeriğini görüntüler. |
dumpheap |
Atık olarak toplanan yığın hakkındaki bilgileri ve nesnelerle ilgili toplama istatistiklerini görüntüler. |
dumpil |
Yönetilen bir yöntemle ilişkili ortak ara dili (CIL) görüntüler. |
dumplog |
Bir bellek içi yük günlüğünün içeriğini belirtilen dosyaya yazar. |
dumpmd |
Belirtilen adreste MethodDesc yapı hakkındaki bilgileri görüntüler. |
dumpmodule |
Belirtilen adreste modül hakkındaki bilgileri görüntüler. |
dumpmt |
Belirtilen adreste yöntem tablosu hakkındaki bilgileri görüntüler. |
dumpobj |
Belirtilen adreste nesnenin bilgilerini görüntüler. |
dumpruntimetypes |
GC yığınındaki tüm System.RuntimeType nesnelerini bulur ve başvurdıkları tür adını ve MethodTable'ı da yazdırır. |
dumpsig |
tarafından <sigaddr> <moduleaddr>belirtilen bir yöntemin veya alanın imzasını dökümünü alır. |
dumpsigelem |
İmza nesnesinin tek bir öğesinin dökümünü alır. |
dumpstackobjects |
Geçerli yığının sınırları içinde bulunan tüm yönetilen nesneleri görüntüler. |
dumpvc |
Değer sınıfının alanları hakkındaki bilgileri görüntüler. |
eeheap |
İç çalışma zamanı veri yapıları tarafından kullanılan işlem belleği hakkındaki bilgileri görüntüler. |
eestack |
İşlemdeki tüm iş parçacıklarında çalışır dumpstack . |
eeversion |
Çalışma zamanı ve SOS sürümleri hakkındaki bilgileri görüntüler. |
ehinfo |
JIT-ed yönteminde özel durum işleme bloklarını görüntüler. |
exit veya quit |
Etkileşimli moddan çıkar. |
finalizequeue |
Sonlandırma için kaydolan tüm nesneleri görüntüler. |
findappdomain |
Bir GC nesnesinin AppDomain'ini çözümlemeye çalışır. |
gchandles |
İşlemdeki çöp toplayıcı tanıtıcılarıyla ilgili istatistikleri görüntüler. |
gcheapstat |
Çöp toplayıcı hakkındaki istatistikleri görüntüler. |
gcinfo |
Bir yöntem için JIT GC kodlamasını görüntüler. |
gcroot |
Belirtilen adreste nesneye yapılan başvurular (veya kökler) hakkındaki bilgileri görüntüler. |
gcwhere |
Belirtilen adresin GC yığınındaki konumu görüntüler. |
histclear |
Hist komutları ailesi tarafından kullanılan tüm kaynakları serbest bırakır. |
histinit |
Hatası ayıklanana kaydedilen yük günlüğünden SOS yapılarını başlatır. |
histobj |
Tüm yük günlüğü yeniden yerleştirme kayıtlarını inceler ve bir bağımsız değişken olarak geçirilen adrese yönlendirebilecek çöp toplama yeniden konumlandırmaları zincirini görüntüler. |
histobjfind |
Belirtilen adreste nesneye başvuran tüm günlük girdilerini görüntüler. |
histroot |
Belirtilen kökün tanıtımlarıyla ve yeniden konumlandırılmalarıyla ilişkili bilgileri görüntüler. |
histstats |
Stres günlüğü istatistiklerini görüntüler. |
ip2md |
MethodDesc JIT ile derlenmiş kodda belirtilen adresteki yapıyı görüntüler. |
listnearobj |
Belirtilen adresin önündeki ve sonrasındaki nesneyi görüntüler. |
logopen |
Konsol dosyası günlüğünü etkinleştirir. |
logclose |
Konsol dosyası günlüğünü devre dışı bırakır. |
logging |
İç SOS günlüğünü etkinleştirir/devre dışı bırakır. |
lm veya modules |
İşlemdeki yerel modülleri görüntüler. |
name2ee |
Belirtilen modülde MethodTable belirtilen tür veya yöntem için ve EEClass yapılarını görüntüler. |
objsize |
Belirtilen nesnenin boyutunu görüntüler. |
parallelstacks |
Birleştirilmiş iş parçacıkları yığınını Visual Studio 'Paralel Yığınlar' paneline benzer şekilde görüntüler. |
pathto |
gc yolunu ile <root><target>görüntüler. |
pe veya printexception |
Belirtilen adreste sınıfından türetilen herhangi bir nesnenin Exception alanlarını görüntüler ve biçimlendirebilir. |
r veya registers |
İş parçacığının kayıtlarını görüntüler. |
runtimes |
Hedefteki çalışma zamanlarını listeler veya varsayılan çalışma zamanını değiştirir. |
setclrpath |
kullanarak setclrpath <path>coreclr dac/dbi dosyalarını yüklemek için yolu ayarlar. |
setsymbolserver |
Sembol sunucusu desteğini etkinleştirir. |
sos |
Çeşitli coreclr hata ayıklama komutlarını yürütür. söz dizimini sos <command-name> <args>kullanın. Daha fazla bilgi için bkz. 'soshelp'. |
soshelp veya help |
Kullanılabilir tüm komutları görüntüler. |
soshelp <command> veya help <command> |
Belirtilen komutu görüntüler. |
syncblk |
SyncBlock tutucu bilgilerini görüntüler. |
taskstate |
Görev durumunu okunabilir bir biçimde görüntüler. |
threadpool |
Çalışma zamanı iş parçacığı havuzu hakkındaki bilgileri görüntüler. |
threadpoolqueue |
Kuyruğa alınmış iş parçacığı havuzu iş öğelerini görüntüler. |
threadstate |
Bir iş parçacığı durumunun anlamını oldukça yazdırır. |
threads <threadid> veya setthread <threadid> |
SOS komutları için geçerli iş parçacığı kimliğini ayarlar veya görüntüler. |
timerinfo |
Zamanlayıcıları çalıştırma hakkındaki bilgileri görüntüler. |
token2ee |
Belirtilen belirteç ve modül için MethodTable yapısını ve MethodDesc yapısını görüntüler. |
traverseheap |
Yığın bilgilerini CLR Profiler tarafından anlaşılan bir biçimde bir dosyaya yazar. |
verifyheap |
GC yığınında bozulma belirtileri olup olmadığını denetler. |
verifyobj |
Bir bağımsız değişken olarak geçirilen nesnede bozulma işaretleri olup olmadığını kontrol eder. |
Not
Ek ayrıntılar .NET için
dotnet-dump ps
Dökümlerin toplanabileceği dotnet işlemlerini listeler.
dotnet-dump sürüm 6.0.320703 ve sonraki sürümler, varsa her işlemin başlatıldığı komut satırı bağımsız değişkenlerini de görüntüler.
Özet
dotnet-dump ps [-h|--help]
Örnek
komutunu dotnet run --configuration Releasekullanarak uzun süre çalışan bir uygulama başlattığınızı varsayalım. Başka bir pencerede komutunu çalıştırırsınız dotnet-dump ps . Göreceğiniz çıkış aşağıdaki gibidir. Komut satırı bağımsız değişkenleri varsa, bunlar dotnet-dump sürüm 6.0.320703 ve sonraki sürümlerde gösterilir.
> dotnet-dump ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
dotnet-dump’ı kullanma
İlk adım bir döküm toplamaktır. Çekirdek dökümü zaten oluşturulduysa bu adım atlanabilir. İşletim sistemi veya .NET Core çalışma zamanının yerleşik dump oluşturma özelliği her biri çekirdek dökümleri oluşturabilir.
$ dotnet-dump collect --process-id 1902
Writing minidump to file ./core_20190226_135837
Written 98983936 bytes (24166 pages) to core file
Complete
Şimdi şu komutla çekirdek dökümünü analiz edin analyze :
$ 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.
>
Bu eylem aşağıdaki gibi komutları kabul eden etkileşimli bir oturum açar:
> 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]
Uygulamanızı öldüren işlenmeyen bir özel durumu görmek için:
> 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
Bellek sızıntılarını ve ayırmalarını analiz etme
Uygulamanız artık gerekli olmayan nesnelere başvurular tuttuğunda bellek sızıntıları oluşur ve çöp toplayıcının belleği geri kazanmasını engeller. Bellek sızıntılarını tanımlamak, en büyük nesneleri bulmak ve belleğin nerede kullanıldığını anlamak için kullanın dotnet-dump .
Bir bellek sızıntısında hata ayıklamanın tam kılavuzu için bkz. .NET'da bellek sızıntısını giderme.
En büyük nesneleri tanımlama
Yığındaki dumpheap nesnelerin toplam boyuta göre sıralanmış özetini görmek için komutunu seçeneğiyle -stat birlikte kullanın:
> 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
Bu çıkış, en çok bellek kullanan türleri gösterir. Bu örnekte nesneler System.String yaklaşık 19 MB, nesneler ise Customer yaklaşık 4,8 MB tüketir.
Nesneleri ad alanına veya derlemeye göre tanımlama
Hangi modüllerin veya ad alanlarının -type bellek kullandığını bulmak için kısmi tür adıyla seçeneğini kullanarak sonuçları filtreleyin:
> 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
Bu yaklaşım, kod tabanınızın hangi bölümlerinin bellek tüketiminden sorumlu olduğunu belirlemenize yardımcı olur.
En yüksek örnekleme sayısını bulma
Toplam boyuttan bağımsız olarak en çok örneğe sahip türleri görmek için çıktıdaki Count sütununa dumpheap -stat bakın. Yüksek örnek sayısına sahip nesneler verimsiz nesne oluşturma veya önbelleğe alma sorunlarını gösterebilir:
> dumpheap -stat
Statistics:
MT Count TotalSize Class Name
00007f6c1dc00f90 206770 19494060 System.String
00007f6c20a67498 200000 4800000 testwebapi.Controllers.Customer
00007f6c1dc021c8 1749 95696 System.SByte[]
Bu örnekte 206.770 String örnek ve 200.000 Customer örnek gösterilmektedir.
Gcroot ile nesne başvurularını analiz etme
Büyük veya çok sayıda nesneyi tanımladıktan sonra, bir nesnenin neden çöp toplanmadığını öğrenmek için kullanın gcroot . komutu GC gcroot köklerinden belirli bir nesneye başvuru zincirini gösterir:
> 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.
Bu çıkış, nesnenin Customer bir CustomerCache nesne tarafından tutulduğunu gösterir ve bu da kodunuzdaki sızıntının kaynağını belirlemenize yardımcı olur.
Belleği nesne boyutuna göre analiz etme
Nesneleri boyuta -min göre filtrelemek için ve -max seçeneklerini kullanın:
> dumpheap -min 100000 -stat
Statistics:
MT Count TotalSize Class Name
00007f6c21625038 6 4063376 testwebapi.Controllers.Customer[]
00007f6c1dc014c0 12 416464 System.Byte[]
Total 18 objects
Bu komut yalnızca 100.000 bayttan büyük nesneleri gösterir ve en büyük bellek tüketicilerine odaklanmanıza yardımcı olur.
Kilitlenmeleri bulun
İş parçacıklarının kaynakları beklerken engellendiği kilitlenme durumlarını tanılamak için kullanın dotnet-dump . Tam bir kilitlenme hata ayıklama kılavuzu için bkz. .NET'da kilitlenmeyi giderme.
Tüm iş parçacıklarını listeleme
threads Tüm yönetilen iş parçacıklarını görmek için komutunu kullanın:
> threads
*0 0x1DBFF (121855)
1 0x1DC01 (121857)
2 0x1DC02 (121858)
...
İş parçacığı yığınlarını inceleme
Tüm iş parçacıklarının çağrı yığınlarını görmek için kullanın clrstack -all :
> clrstack -all
Birden çok iş parçacığının üzerinde veya benzer eşitleme temel öğelerinde engellendiği Monitor.Enter desenleri arayın.
Kilit sahiplerini bulma
Hangi iş parçacıklarının syncblk kilitleri tuttuğunu ve hangi iş parçacıklarının beklediğini görmek için komutunu kullanın:
> 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
MonitorHeld sütunu, kilidi bekleyen iş parçacığı sayısını gösterir. Sahip Olan İş Parçacığı Bilgileri sütunu, kilidin sahibi olan iş parçacığını gösterir.
Gelişmiş bellek analizi senaryoları
Birden çok dökümü karşılaştırma
Zaman içindeki bellek artışlarını anlamak için birden çok döküm toplayın ve bunları karşılaştırın:
- Temel dökümü toplama:
dotnet-dump collect -p <pid> -o baseline.dmp - Uygulamanızın çalışmasına ve daha fazla bellek kullanmasına izin verin.
- İkinci dökümü toplayın:
dotnet-dump collect -p <pid> -o after.dmp - Her iki dökümü de analiz edin ve sonuçları karşılaştırın
dumpheap -stat.
İkinci dökümde önemli ölçüde daha fazla örneği veya daha büyük toplam boyutu olan türleri arayın.
Belirli nesne türleri için belleği analiz etme
Belirli bir türün tüm örneklerinin dökümünü almak için:
> dumpheap -type Customer
Address MT Size
00007f6ad09421f8 00007f6c20a67498 24
00007f6ad0942210 00007f6c20a67498 24
...
Ardından tek tek nesneleri incelemek için kullanın dumpobj :
> 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
Docker kapsayıcısında döküm toplama
dotnet-dump
ptrace kapsayıcıda özellikler gerektirir. Onlara vermenin yaygın bir yolu kapsayıcıyı ile --cap-add=SYS_PTRACEbaşlatmaktır. Ortamınıza bağlı olarak, kapsayıcının seccomp profilini de ayarlamanız gerekebilir. Kapsayıcı güvenliği yapılandırma sorunlarını tanılama konusunda yardım için Bkz. Dökümler: SSS .
.NET SDK'sı olmayan bir üretim görüntüsüne dotnet-dump yüklemek için Yükleme bölümünden direct indirme bağlantılarını kullanın veya sdk görüntüsünden araç ikili dosyalarını kopyalamak için multi-stage Docker derlemesi kullanın. Kapsayıcı tanılama yönergelerinin tamamı için bkz. Linux kapsayıcılarında tanılamaları toplama.
Döküm toplama sorunlarını giderme
Döküm toplama işleminin çağırabilmesini ptracegerektirir. Dökümleri toplamayla ilgili sorunlarla karşılaşıyorsanız, üzerinde çalıştığınız ortam bu tür çağrıları kısıtlayacak şekilde yapılandırılabilir.
Sorun giderme ipuçları ve yaygın sorunların olası çözümleri için Bkz. Dökümler: SSS.