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-gcdump sürüm 10.0 ve sonraki sürümler
Yükleme
İndirmenin ve yüklemenin dotnet-gcdumpiki yolu vardır:
dotnet genel aracı:
NuGet paketinin en son sürüm sürümünü
dotnet-gcdumpyüklemek için dotnet tool install komutunu kullanın:dotnet tool install --global dotnet-gcdumpDoğrudan indirme:
Platformunuzla eşleşen araç yürütülebilir dosyasını indirin:
işletim sistemi Platforma Windows x86 | x64 | Arm | Arm64 Linux işletim sistemi x64 | Arm | Arm64 | musl-x64 | musl-Arm64
Not
Bir x86 uygulamasında kullanmak dotnet-gcdump için aracın ilgili x86 sürümünü kullanmanız gerekir.
Özet
dotnet-gcdump [-h|--help] [--version] <command>
Açıklama
Genel araç, dotnet-gcdump EventPipe kullanarak canlı .NET işlemlerinin GC (Çöp Toplayıcı) dökümlerini toplar. GC dökümleri, hedef işlemde bir GC tetiklenerek, özel olaylar etkinleştirilerek ve olay akışından nesne köklerinin grafiği yeniden oluşturularak oluşturulur. Bu işlem, işlem çalışırken ve minimum ek yükle GC dökümlerinin toplanmasına olanak tanır. Bu dökümler çeşitli senaryolar için kullanışlıdır:
- Yığındaki nesnelerin sayısını zaman içinde birkaç noktada karşılaştırma.
- Nesnelerin köklerini analiz etme ("bu türe hala başvuruda bulunan nedir?") gibi soruları yanıtlama.
- Yığındaki nesnelerin sayısıyla ilgili genel istatistikleri toplama.
dotnet-gcdump'tan yakalanan GC dökümünü görüntüleme
Windows'da dosyalar .gcdump analiz için PerfView'da veya Visual Studio'da görüntülenebilir. Şu anda Windows dışı platformlarda açmanın bir .gcdump yolu yoktur.
Karşılaştırma deneyimi elde etmek için birden çok .gcdumps toplayabilir ve bunları Visual Studio'da aynı anda açabilirsiniz.
Seçenekler
--versionYardımcı programın sürümünü
dotnet-gcdumpgörüntüler.-h|--helpKomut satırı yardımlarını gösterir.
Komutlar
| Komut |
|---|
| dotnet-gcdump collect |
| dotnet-gcdump ps |
| dotnet-gcdump raporu |
dotnet-gcdump collect
Şu anda çalışan bir işlemden GC dökümü toplar.
Uyarı
GC yığınında gezinmek için bu komut, özellikle GC yığını büyük olduğunda çalışma zamanını uzun süre askıya alabilen 2. nesil (tam) bir çöp toplama işlemini tetikler. GC yığını büyük olduğunda performansa duyarlı ortamlarda bu komutu kullanmayın.
Özet
dotnet-gcdump collect [-h|--help] [-p|--process-id <pid>] [-o|--output <gcdump-file-path>] [-v|--verbose] [-t|--timeout <timeout>] [-n|--name <name>] [--dsrouter <ios|ios-sim|android|android-emu>]
Seçenekler
-h|--helpKomut satırı yardımlarını gösterir.
-p|--process-id <pid>GC dökümünü toplamak için işlem kimliği.
Not
Linux ve macOS'ta bu seçeneği kullanmak için hedef uygulamanın ve
dotnet-gcdumpaynıTMPDIRortam değişkenini paylaşması gerekir. Aksi takdirde, komut zaman aşımına uğradı.-o|--output <gcdump-file-path>Toplanan GC dökümlerinin yazılması gereken yol. Varsayılan olarak .\YYYYMMDD_HHMMSS_<pid.gcdump> olarak gösterilir.
-v|--verboseGC dökümü toplanırken günlüğün çıktısını alma.
-t|--timeout <timeout>Bu kadar saniyeden uzun sürerse GC dökümünü toplamaktan vazgeçin. Varsayılan değer 30’dur.
-n|--name <name>GC dökümünü toplama işleminin adı.
Not
Linux ve macOS'ta bu seçeneği kullanmak için hedef uygulamanın ve
dotnet-gcdumpaynıTMPDIRortam değişkenini paylaşması gerekir. Aksi takdirde, komut zaman aşımına uğradı.--diagnostic-port <port-address[,(listen|connect)]>Boşaltılacak işlemle iletişim kurmak için kullanılan tanılama bağlantı noktasını ayarlar. dotnet-gcdump ve hedef işlemin içindeki .NET çalışma zamanı, bağlantı noktası adresi üzerinde bir dinleme ve diğeri bağlanarak kabul etmelidir. dotnet-gcdump, veya
--process-idseçeneklerini kullanarak--nameeklerken doğru bağlantı noktasını otomatik olarak belirler. Genellikle yalnızca geçerli işlem ad alanının parçası olmayan bir kapsayıcı içinde çalışan bir işlemle iletişim kurarken bağlantı noktasını açıkça belirtmek gerekir.işletim
port-addresssistemine göre farklılık gösterir:- Linux ve macOS - gibi
/foo/tool1.socketbir Unix etki alanı yuvası yolu. - Windows - gibi
\\.\pipe\my_diag_port1adlandırılmış bir kanalın yolu. - Android, iOS ve tvOS - gibi
127.0.0.1:9000bir IP:bağlantı noktası.
Varsayılan olarak, dotnet-gcdump belirtilen adreste dinler. Adresin arkasına ekleyerek
,connectdotnet-gcdump'un bağlanmasını isteyebilirsiniz. Örneğin,--diagnostic-port /foo/tool1.socket,connectUnix etki alanı yuvasını dinleyen bir .NET çalışma zamanı işlemine/foo/tool1.socketbağlanır.- Linux ve macOS - gibi
--dsrouter <ios|ios-sim|android|android-emu>dotnet-dsrouter'ı başlatır ve buna bağlanır. Dotnet-dsrouter'ın yüklenmesini gerektirir. Daha fazla bilgi için komutunu çalıştırın
dotnet-dsrouter -h.
Not
kullanarak dotnet-gcdumpbir GC dökümü toplamak için hedef işlemi çalıştıran kullanıcıyla aynı kullanıcı veya kök olarak çalıştırılması gerekir. Aksi takdirde araç hedef işlemle bağlantı kuramaz.
Örnekler
İşlem kimliği 1902 olan bir işlemden GC dökümü toplayın:
> dotnet-gcdump collect --process-id 1902 Writing gcdump to './20250601_121500_1902.gcdump'... Finished writing 5763432 bytes.İşlem kimliği 1902 olan bir işlemden GC dökümü toplayın ve bunu özel bir yola kaydedin:
> dotnet-gcdump collect --process-id 1902 --output ./myapp-dump.gcdump Writing gcdump to './myapp-dump.gcdump'... Finished writing 5763432 bytes.Ayrıntılı çıkış içeren ada göre bir işlemden GC dökümü toplayın:
> dotnet-gcdump collect --name my-aspnet-server --verbose [20:54:11] Starting gcdump collection... [20:54:11] Triggering GC... [20:54:12] Writing gcdump to './20250601_205412_4521.gcdump'... Finished writing 5763432 bytes.60 saniyelik özel zaman aşımı ile GC dökümü toplayın:
> dotnet-gcdump collect --process-id 1902 --timeout 60 Writing gcdump to './20250601_121500_1902.gcdump'... Finished writing 5763432 bytes.
dotnet-gcdump ps
GC dökümlerinin toplanabileceği dotnet işlemlerini listeler. dotnet-gcdump 6.0.320703 ve üzeri, varsa her işlemin başlatıldığı komut satırı bağımsız değişkenlerini de görüntüler.
Özet
dotnet-gcdump 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-gcdump ps . Göreceğiniz çıkış aşağıdaki gibidir. Varsa, komut satırı bağımsız değişkenleri sürüm 6.0.320703 ve üzeri kullanılarak dotnet-gcdump gösterilir.
> dotnet-gcdump ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
dotnet-gcdump report <gcdump_filename>
Önceden oluşturulmuş bir GC dökümü veya çalışan bir işlemden bir rapor oluşturun ve öğesine stdoutyazın.
Özet
dotnet-gcdump report [-h|--help] [-p|--process-id <pid>] [-t|--report-type <HeapStat>]
Seçenekler
-h|--helpKomut satırı yardımlarını gösterir.
-p|--process-id <pid>GC dökümünü toplamak için işlem kimliği.
-t|--report-type <HeapStat>Oluşturulacak rapor türü. Kullanılabilir seçenekler: heapstat (varsayılan).
Örnekler
Daha önce oluşturulmuş
.gcdumpbir dosyadan yığın istatistikleri raporu oluşturun:> dotnet-gcdump report ./20250601_121500_1902.gcdumpÇıkışta tür istatistikleri görüntülenir:
Size (Bytes) Count Type ============== ===== ==== 1,603,588,000 22,000,000 System.String 201,096,000 2,010,000 System.Byte[] 100,000,000 1,000,000 System.Char[] 50,000,000 500,000 System.Object[] 25,000,000 250,000 MyApp.Customerİşlem kimliği 1902 olan çalışan bir işlemden yığın istatistikleri raporu oluşturun:
> dotnet-gcdump report --process-id 1902
Sorun giderme
gcdump içinde tür bilgisi yok.
.NET Core 3.1'in öncesinde, EventPipe ile çağrıldıklarında gcdumps arasında tür önbelleğinin temizlenmediği bir sorun vardı. Bu, ikinci ve sonraki gcdumps için tür bilgilerinin gönderilmediğini belirlemek için gereken olaylarla sonuçlandı. Bu, .NET Core 3.1-preview2 sürümünde düzeltildi.
COM ve statik türler GC dökümü içinde değildir.
.NET Core 3.1'in öncesinde, GC dökümü EventPipe aracılığıyla çağrıldığında statik ve COM türlerinin gönderilmediği bir sorun vardı. Bu, .NET Core 3.1'de düzeltilmiştir.
dotnet-gcdumpeksik bilgiler nedeniyle dosya.gcdumpoluşturamıyor; örneğin, [Error] Gcdump sırasında özel durum: System.ApplicationException: ETL dosyası yığın dökümünün başlangıcını gösterir, ancak tamamlanmaz...gcdumpYa da dosya yığının tamamını içermez.dotnet-gcdumpoluşturulan bir 2. nesil koleksiyonu sırasında çöp toplayıcı tarafından yayılan olayların bir izlemesini toplayarak çalışır. Yığın yeterince büyükse veya olay arabelleklerini ölçeklendirmek için yeterli bellek yoksa, yığın grafiğini izlemeden yeniden yapılandırmak için gereken olaylar bırakılabilir. Bu durumda yığınla ilgili sorunları tanılamak için işlemin dökümünün toplanması önerilir.dotnet-gcdump, bellek kısıtlanmış bir ortamda Bellek Yetersiz sorununa neden oluyor gibi görünüyor.dotnet-gcdumpoluşturulan bir 2. nesil koleksiyonu sırasında çöp toplayıcı tarafından yayılan olayların bir izlemesini toplayarak çalışır. Olay koleksiyonu için arabellek hedef uygulamaya aittir ve 256 MB'a kadar büyüyebilir.dotnet-gcdumpkendisi de bellek kullanır. Ortamınız bellek kısıtlanmışsa, hataları önlemek için gcdump toplarken bu faktörleri hesaba eklediğinizden emin olun.