Aracılığıyla paylaş


Laboratuvar 1.2 Kilitlenme sorunlarını giderme - lldb hata ayıklayıcısında sistem tarafından oluşturulan çekirdek döküm dosyalarını analiz etme

Şunlar için geçerlidir: .NET Core 2.1, .NET Core 3.1, .NET 5

Bu makalede, Linux'ta lldb hata ayıklayıcısını yükleme ve yapılandırma ve ardından sistem tarafından oluşturulan .NET Core döküm dosyalarını açma ve analiz etme işlemleri açıklanır.

Önkoşullar

Bu sorun giderme laboratuvarlarını izlemenin en düşük gereksinimi, düşük CPU ve yüksek CPU performans sorunlarını göstermek için bir ASP.NET Core uygulamasına sahip olmaktır.

İnternet'te bu hedefe ulaşmak için birkaç örnek uygulama bulabilirsiniz. Örneğin, istenmeyen davranışları göstermek için Microsoft'un basit webapi örneğini indirip ayarlayabilirsiniz. Alternatif olarak, örnek proje olarak BuggyAmb ASP.NET Core uygulamasını da kullanabilirsiniz.

Bu serinin önceki bölümlerini izlediyseniz, aşağıdaki kurulumun hazır olması gerekir:

  • Nginx, iki web sitesini barındıracak şekilde yapılandırılmıştır:
    • İlki, myfirstwebsite ana bilgisayar üst bilgisini (http://myfirstwebsite) kullanarak istekleri dinler ve istekleri 5000 numaralı bağlantı noktasını dinleyen demo ASP.NET Core uygulamasına yönlendirir.
    • İkincisi, buggyamb ana bilgisayar üst bilgisini (http://buggyamb) kullanarak istekleri dinler ve istekleri 5001 numaralı bağlantı noktasını dinleyen ikinci ASP.NET Core örnek buggy uygulamasına yönlendirir.
  • Her iki ASP.NET Core uygulaması da sunucu yeniden başlatıldığında veya uygulama yanıt vermeyi durdurduğunda otomatik olarak yeniden başlatılan hizmetler olarak çalışıyor olmalıdır.
  • Linux yerel güvenlik duvarı etkinleştirilir ve SSH ve HTTP trafiğine izin verecek şekilde yapılandırılır.

Not

Kurulumunuz hazır değilse "2. Bölüm ASP.NET Core uygulamaları oluşturma ve çalıştırma" bölümüne gidin.

Bu laboratuvara devam etmek için Nginx'in arkasında çalışan en az bir sorunlu ASP.NET Core web uygulamanız olmalıdır.

Bu laboratuvarın hedefi

Bu makale, Linux'ta ASP.NET Core uygulamalarında hata ayıklamaya yönelik iki laboratuvar bölümünün ikincisidir.

Laboratuvar 1.1 Kilitlenme sorununu yeniden oluşturun ve giderin bölümünde, kilitlenme sorununu yeniden oluşturma adımlarını izlediniz ve sorun gidermeye başladınız. Nginx'i ve sistem günlüklerini denetledikten sonra bellek dökümü dosyasını toplayıp analiz ederek sorun giderme işlemine devam ettiniz. Ubuntu'nun çekirdek döküm dosyası yöneticisi apport tarafından oluşturulan kilitlenme çekirdeği döküm dosyasını ayıkladıysanız.

Bu bölümde, lldb hata ayıklayıcısını yükleyip SOS adlı .NET Core hata ayıklayıcısı uzantısıyla birlikte çalışacak şekilde yapılandıracak ve sonra analiz etmek için döküm dosyasını lldb'de açacaksınız.

lldb'yi yükleme

Bu laboratuvar için lldb 3.9 veya sonraki bir sürümü yüklemeniz gerekir. Çeşitli Linux dağıtımlarına yönelik yönergeler Linux'ta LLDB'yi yükleme bölümünde ayrıntılı olarak açıklandı. Bu bölüm için yükleme komutunu kullanmanızı apt öneririz: sudo apt install lldb. Aşağıdaki ekran görüntüsünde, lldb-6.0'ın bazı bağımlılıklarla birlikte yüklendiğini görebilirsiniz.

sudo komutunun ekran görüntüsü.

Yükleme tamamlandıktan sonra, çekirdek döküm dosyası açıldığında SOS'yi otomatik olarak yükleyebilmesi için lldb'yi yapılandırmanız gerekir.

lldb'yi yapılandırma

Çekirdek döküm dosyasını lldb'de açmadan önce, simge yolunu ayarlamak, simgeleri indirmek ve lldb açıldığında SOS'yi otomatik olarak yüklemek için şu gerekli adımları izleyin:

  1. dotnet-symbol aracını yükleyin:

    dotnet tool install -g dotnet-symbol

  2. Hedef döküm dosyasının simgelerini indirin:

    dotnet-symbol <path_of_dump_file>

  3. SOS'u yükleme:

    1. dotnet-sos genel aracını yükleyin:

      dotnet tool install -g dotnet-sos

    2. SOS'u yükleme:

      dotnet-sos install

dotnet-symbol aracını yükleme

Önceki bölümde dotnet-dump ve dotnet-gcdump araçlarıyla birlikte dotnet-symbol aracını zaten yüklemiş olmanız gerekir. Bu araçları henüz yüklemediyseniz, devam etmeden önce yükleyin. Bunu yapmak için komutunu çalıştırarak dotnet tool install -g dotnet-symbol dotnet-symbols yükleyin. henüz yapmadıysanız dotnet-dump ve dotnet-gcdump'u yükleyin. Aşağıdaki ekran görüntüsünde gösterildiği gibi üç aracı yüklemiş olmanız gerekir.

Liste komutunun ekran görüntüsü.

Döküm dosyası için sembolleri indirme

1. bölümde, çekirdek döküm dosyasını apport raporundan nasıl çıkarabileceğiniz anlatıldı. Şimdi sembol dosyalarını indirmenin zamanı geldi. Bu makalede açıklandığı gibi simgeler yüksek düzeyde çalışır. Kaynak kod ile ikili dosyalar arasında eşleme görevi görürler. Bu eşlemeler, hata ayıklayıcılar tarafından çağrı yığınını okurken işlev veya yöntem adlarını, kaynak satır bilgilerini veya yerel değişken adlarını çözümlemek için kullanılır.

bellek dökümü dosyasının dotnet-symbol ~/dumps/dotnet/CoreDump -o ~/dumps/symbols --host-only ~/dumps/symbols simgelerini dizine indirmek için komutunu kullanacaksınız.

Dökümler komutunun ekran görüntüsü.

Anahtarı eklemezseniz --host-only simge dosyalarını indirdiğinizde birkaç "HTTP 404 bulunamadı" hata iletisi alabilirsiniz. Bu iletileri güvenle yoksayabilirsiniz. --host-only parametresi yalnızca konak programını indirir. lldb'nin ASP.NET Core uygulamasında hata ayıklamaya başlaması için gereken tek şey budur.

Sonraki adım, SOS tarafından yönetilen hata ayıklama uzantısını yüklemektir. Bu, çözümlemeyi çalıştırmak için gereken .NET hata ayıklama komutlarını kullanıma sunar.

SOS'u yükleme

SOS nedir? Resmi belgelere göre, SOS bir geliştiricinin ASP.NET Core ve diğer dahil olmak üzere bir .NET uygulamasının yönetilen durumunu incelemesine olanak tanıyan bir hata ayıklayıcı uzantısıdır. .NET WPF ve .NET Windows Forms gibi NET tabanlı uygulamalar. SOS, Windows'da WinDbg veya cdb hata ayıklayıcısı ve Linux ve macOS üzerinde lldb tarafından yüklenebilen platformlar arası bir uzantıdır.

SOS'u yüklemek için önce aşağıdaki dotnet-sos aracını yüklemeniz gerekir:

dotnet tool install -g dotnet-sos

Ardından SOS'u yükleyin:

dotnet-sos install

Aşağıdaki ekran görüntüsünde başarılı bir yüklemenin sonucu gösterilmektedir. dotnet-sos aracının lldb hata ayıklayıcısını yapılandırdığından, hata ayıklayıcı başlatıldığında SOS uzantısının otomatik olarak yüklenmesi gerektiğine dikkat edin.

Yükleme komutunun ekran görüntüsü.

Sonunda lldb kullanarak döküm dosyasını açmaya hazırsınız.

lldb'de çekirdek dökümünü açma

Çekirdek dökümünü açmak için lldb ve aşağıdaki söz dizimini kullanmanız gerekir:

lldb --core <dump path> <host-program>

<host-program>, .NET Core uygulamasını başlatan yerel programdır. Uygulama kendi kendine içermediği sürece bu genellikle dotnet'tir. Bu bağımsız bir uygulamaysa, bu değişken .dll uzantısı olmayan uygulamanın adıdır.

Aynı klasör adlarını kullanarak takip ettiğiniz varsayıldığında, önceki bölümde oluşturduğunuz bellek dökümü dosyasının yolu ~/dumps/dotnet/CoreDump olmalıdır. Bu nedenle, dosyasını açmak için komutunu çalıştıracaksınız lldb --core ~/dumps/dotnet/CoreDump .

Aşağıdaki ekran görüntüsünde, bellek dökümü dosyasını açan lldb hata ayıklayıcısı gösterilmektedir.

lldb komutunun ekran görüntüsü.

Simge ayarlama

Simge dosyalarını dizindeki komutunu kullanarak dotnet-symbol indirdiğiniz anımsayın ~/dumps/symbols . Hata ayıklayıcısı içinde çalıştırmanız gereken ilk komut, sembol indirmeleri için ayarladığınız dizine sembol sunucusu yolunu ayarlamaktır:

setsymbolserver -directory ~/dumps/symbols

Ardından simgeleri yükleyin: loadsymbols

loadsymbols komutunun ekran görüntüsü.

lldb ve SOS komutlarını çalıştırma

Birkaç lldb komutu vardır. Komutunu kullanarak help bunları listeleyebilirsiniz. Listede, SOS komutlarının kullanıcı tanımlı komutlar altında da listelendiğini görebilirsiniz. SOS, lldb için bir eklentidir. Aynı help komutu kullanarak eklenti yardım bilgilerini alabilirsiniz.

Not

Lldb çıkışını ara sıra temizlemek isteyebilirsiniz. Bunu yapmak için Ctrl+L tuşlarına basın.

Başlamak için ("geri izleme") komutunu kullanarak iş parçacığının yerel çağrı yığınına bt bakın. Bu komut, etkin iş parçacığının çağrı yığınını gösterir.

bt komutunun ekran görüntüsü.

Ardından, SOS clrstack komutunu kullanarak yönetilen çağrı yığınını inceleyin.

clrstack komutunun ekran görüntüsü.

Herhangi bir bilgi alamamalısınız. Bildirilen yığın eksik olduğundan yığın kılavuzu başarısız olur. Bu, daha önce tartışılan durumla ilgilidir: Otomatik olarak oluşturulan çekirdek döküm dosyası tüm yönetilen durumları toplayamaz.

Ayrıca bir özel durumun oluştuğu ve bunun işlemin kilitlenmesine neden olduğunu da hatırlayın. SOS pe komutunu çalıştırarak özel durum bilgilerine göz atın.

pe komutunun ekran görüntüsü.

Çıktıda görebileceğiniz gibi, pe komut geçerli iş parçacığında oluşan son özel durum (varsa) hakkındaki bilgileri görüntüler.

Bu durumda özel durum iletisi kaynak geçici olarak kullanılamıyor. Ancak, özel durum türü ve işlev adları çözümlenmez. Bunun yerine, değerleri bilinmiyor olarak gösterilir.

Özel durumun adresi de görüntülenir. Daha fazla ayrıntı olup olmadığını görmek için bu adresi komutta parametre olarak geçirmeyi pe deneyebilirsiniz. Ardından komutunu çalıştırın pe 00007F8244048538.

Not

Bu komutta, adresi döküm dosyasında görüntülenen adresle değiştirin.

Komuttaki bilinmeyen özel durum türünün ekran görüntüsü.

Yığında başvuruda bulunan nesneleri görüntülemek isteseniz bile, aynı bilinmeyen değerini görürsünüz.

dso komutunun ekran görüntüsü.

Yığındaki nesnelerden birinin adresini seçip komutunu kullanarak dumpobj <address> nesneyi gözden geçirerek daha fazla bilgi almayı deneyebilirsiniz.

dumpobj komutunun ekran görüntüsü.

Ancak, yalnızca daha fazla bilinmeyen ileti döndürdüğü için bu komutun da sınırlı bir etkiye sahip olacağı sonucuna varacaksınız. Otomatik olarak oluşturulan döküm dosyasıyla çalışmayı durdurmanın zamanı geldi. lldb oturumunu exit sonlandırmak için komutunu çalıştırın.

Özetlemek gerekirse, sistem tarafından oluşturulan döküm dosyası size bazı bilgiler verir, ancak yine de bazı önemli bilgileri kaçırıyorsunuz. Sonraki bölümde kilitlenme dökümünü yakalamak için önerilen yaklaşım sunulacaktır.

Sonraki adımlar

Laboratuvar 1.3 Kilitlenme sorununu giderme - Createdump aracıyla çekirdek kilitlenme dökümlerini yakalama