Aracılığıyla paylaş


.NET Tanılama Çözümleyicileri ile yönetilen bellek dökümü hatalarını ayıklama

Bu öğreticide şunları yapacaksınız:

  • Bellek dökümü açma
  • Dökümde çözümleyicileri seçme ve yürütme
  • Çözümleyicilerin sonuçlarını gözden geçirme
  • Sorunlu koda gezinme

Bu makalede açıklanan örnekte, sorun uygulamanızın isteklere zamanında yanıt vermemesidir.

Visual Studio'da bellek dökümü açma

  1. Dosya > Aç > menü komutunu kullanarak Visual Studio'da bellek dökümünü açın ve bellek dökümünüzü seçin.

  2. Bellek Dökümü Özeti sayfasında Tanılama Analizini Çalıştır adlı yeni bir Eyleme dikkat edin.

    Action - Diagnostics Analysis

  3. Hata ayıklayıcıyı başlatmak için bu eylemi seçin ve temel alınan belirtiye göre düzenlenmiş kullanılabilir çözümleyici seçeneklerinin listesini içeren yeni Tanılama Analizi sayfasını açın.

Dökümde çözümleyicileri seçme ve yürütme

Bu belirtileri araştırmak için, bu örnekteki sorunla en iyi şekilde eşleştiğinden İşlem Yanıt Hızı altında en iyi seçenekler kullanılabilir.

Select diagnostics analyzers

  1. Araştırma işlemini başlatmak için Çözümle düğmesine tıklayın

  2. Çözümleyici, bellek dökümü içinde yakalanan işlem bilgileri ve CLR verilerinin birleşimine göre sonuçlar sunar.

Çözümleyicilerin sonuçlarını gözden geçirme

  1. Bu durumda çözümleyici iki hata buldu. Çözümleme Özeti'ni ve önerilen Düzeltmeyi görmek için çözümleyici sonucunu seçin.

    Diagnostics analyzers results

  2. Çözümleme Özeti, "CLR iş parçacığı havuzunda açlık yaşandığını" belirtti. Bu bilgiler, CLR'nin şu anda tüm kullanılabilir iş parçacığı havuzu iş parçacıklarını kullandığını gösterir. Bu, bir iş parçacığı serbest bırakılana kadar hizmetinizin yeni isteklere yanıt veremeyeceği anlamına gelir.

    Not

    Bu durumda düzeltme şu şekildedir: "İzleyiciler, Olaylar, Görev veya iş parçacığınızı engelleyebilecek diğer nesneler için zaman uyumlu olarak beklemeyin. Yöntemi zaman uyumsuz olacak şekilde güncelleştirip güncelleştirebileceğinize bakın."

Sıradaki işim sorunlu kodu bulmak.

  1. Visual Studio çağrı yığınını göster bağlantısına tıklandığında hemen bu davranışı sergileyen iş parçacıklarına geçilir.

  2. Çağrı Yığını penceresinde, kodumu (SyncOverAsyncExmple.) Çerçeve kodundan (System.) hızla ayırt etme olasılığı olan yöntemler gösterilir.

    Diagnostics analyzers link to call stack

  3. Her çağrı yığını çerçevesi bir yönteme karşılık gelir ve yığın çerçevelerine çift tıklayarak Visual Studio bu iş parçacığında doğrudan bu senaryoya yol açan koda gider.

  4. Bu örnekte sembol veya kod yoktur, ancak Semboller yüklenmedi sayfasında Kaynak kodunu ayrıştır seçeneğini belirleyebilirsiniz.

    Decompilation

  5. Aşağıdaki kaynakta zaman uyumsuz bir Görevin (ConsumeThreadPoolThread) zaman uyumlu engelleme işlevini çağırdığını görebilirsiniz.

    Not

    Bir sinyal alıncaya kadar geçerli iş parçacığı havuzu iş parçacığını engelleyen WaitHandle.WaitOne yöntemini içeren "DoSomething()" yöntemi.

    Uygulamaların yanıt hızını geliştirmek için engelleyici zaman uyumlu kodun tüm zaman uyumsuz bağlamlardan kaldırılması önemlidir.

    Analyze decompiled code