Aracılığıyla paylaş


Yığın çözümleme aracı (dotnet-gcdump)

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:

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

  • --version

    Yardımcı programın sürümünü dotnet-gcdump görüntüler.

  • -h|--help

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

    Komut 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-gcdump aynı TMPDIR ortam 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|--verbose

    GC 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-gcdump aynı TMPDIR ortam 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-id seçeneklerini kullanarak --name eklerken 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-address sistemine 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 ,connect dotnet-gcdump'un bağlanmasını isteyebilirsiniz. Örneğin, --diagnostic-port /foo/tool1.socket,connect Unix etki alanı yuvasını dinleyen bir .NET çalışma zamanı işlemine /foo/tool1.socket bağlanır.

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

    Komut 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ş .gcdump bir 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-gcdump eksik bilgiler nedeniyle dosya .gcdump oluş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.. .gcdump Ya da dosya yığının tamamını içermez.

    dotnet-gcdump oluş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-gcdump oluş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-gcdump kendisi 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.