Aracılığıyla paylaş


Döküm toplama ve analiz yardımcı programı (dotnet-dump)

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:

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

  • --version

    dotnet-dump yardımcı programının sürümünü görüntüler.

  • -h|--help

    Komut 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|--help

    Komut 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, Full varsayı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.

  • --diag

    Döküm toplama tanılama günlüğünü etkinleştirir.

  • --crashreport

    Kilitlenme 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 SOS Hata Ayıklama Uzantısı'nda bulunabilir.

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:

  1. Temel dökümü toplama: dotnet-dump collect -p <pid> -o baseline.dmp
  2. Uygulamanızın çalışmasına ve daha fazla bellek kullanmasına izin verin.
  3. İkinci dökümü toplayın: dotnet-dump collect -p <pid> -o after.dmp
  4. 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.

Ayrıca bkz.