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.
Ş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.
- İlki, myfirstwebsite ana bilgisayar üst bilgisini (
- 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.
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:
dotnet-symbol aracını yükleyin:
dotnet tool install -g dotnet-symbol
Hedef döküm dosyasının simgelerini indirin:
dotnet-symbol <path_of_dump_file>
SOS'u yükleme:
dotnet-sos genel aracını yükleyin:
dotnet tool install -g dotnet-sos
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.
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.
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.
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.
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
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.
Ardından, SOS clrstack
komutunu kullanarak yönetilen çağrı yığınını inceleyin.
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.
Çı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.
Yığında başvuruda bulunan nesneleri görüntülemek isteseniz bile, aynı bilinmeyen değerini görürsünüz.
Yığındaki nesnelerden birinin adresini seçip komutunu kullanarak dumpobj <address>
nesneyi gözden geçirerek daha fazla bilgi almayı deneyebilirsiniz.
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.