Aracılığıyla paylaş


Laboratuvar 4.2 Başka bir makinedeki çekirdek döküm dosyalarını analiz etme - Çekirdek döküm dosyalarını açmak için WSL kullanma

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

Bu makalede, başka bir sanal makinede (VM) çekirdek döküm dosyası açmak için Linux için Windows Alt Sistemi (WSL) sürüm 2'nin nasıl kullanılacağı açıklanır.

Önkoşullar

Bu bölümü takip edebilmek ve tamamlayabilmek için aşağıdakilere sahip olmanız gerekir:

  • Linux için Windows Alt Sistemi etkinleştirmek için Windows 10 tabanlı bir bilgisayar.
  • Herhangi bir klasördeki Windows tabanlı bilgisayarınıza kopyalanan en az bir çekirdek döküm dosyası.

Bu laboratuvarın hedefi

WSL sürüm 2'yi kullanarak başka bir VM'de çekirdek döküm dosyasını açmayı öğreneceksiniz.

Linux için Windows Alt Sistemi kullanma

WSL , geliştiricilerin geleneksel vm veya çift önyükleme kurulumu ek yükü olmadan doğrudan Windows üzerinde bir GNU/Linux ortamı çalıştırmasına olanak tanır.

WSL'yi etkinleştirmek için Windows Server Yükleme Kılavuzu'na gidin ve WSL2'ye yükseltin. Bu laboratuvarda linux işletim sisteminizle aynı Ubuntu 18.04 LTS'yi seçtiğiniz varsayılır. Sistem WSL2 kullanılarak çalıştırılır.

WSL2'yi yükledikten sonra ve sudo apt upgrade komutlarını kullanarak paket yöneticisini güncelleştirinsudo apt update. Linux VM'yi ilk kez yüklerken bu serinin önceki bölümlerinde yer alan bu komutları biliyor olmanız gerekir.

  • sudo apt update

    BuggyAmb güncelleştirmesi.

  • sudo apt upgrade

    BuggyAmb yükseltmesi.

Windows'tan Linux'a dosya kopyalama

Artık Windows tabanlı bilgisayarınızda WSL2'nin çalışıyor olması gerekir. Önceki bölümde, Windows tabanlı bilgisayarınızdaki D:\Learn\Linux\Dumps klasöründen çekirdek döküm dosyalarını kopyaladınız ve dosya adının coredumps.tar.gz olduğu varsayıldı. Şimdi amacınız D:\Learn\Linux\Dumps\coredumps.tar.gz'ı WSL2 içinde çalışan Linux VM'ye kopyalamaktır.

WSL2'deki komut satırının aşağıdaki ekran görüntüsüne baktığınızda, Windows'taki C sürücüsünün WSL2 Linux makinesinde /mnt/c olarak eşlendiğine dikkat edin. Bu nedenle, D:\Learn\Linux\Dumps klasörünün içeriğini listelemek için komutunu çalıştırabilirsinizll mnt/d/Learn/Linux/Dumps/.

BuggyAmb ll.

Şimdi coredumps.tar.gz dosyasını kopyalayıp Linux giriş dizinindeki döküm dosyaları klasörüne ayıklayın. Adımlar kolaydır:

  1. komutunu kullanarak dizini giriş dizininizle cd ~ değiştirin.
  2. komutunu çalıştırarak mkdir dumpsdöküm dosyaları klasörü oluşturun.
  3. komutunu çalıştırarak tar -xf /mnt/d/Learn/Linux/Dumps/coredumps.tar.gz -C dumps/coredumps.tar.gz dosyasını ayıklayın.

Aşağıdaki ekran görüntüsünde bu komutların nasıl çalıştığını görebilirsiniz.

BuggyAmb cd.

dotnet-dump kullanarak çekirdek döküm dosyasını açma

Yordamın geri kalanı, .NET Core ve .NET SDK'sını yüklediğiniz önceki sorun giderme laboratuvarlarına benzer. Bu bölüm, bu adımları tekrar gerçekleştirmenizi sağlayacaktır.

dotnet-dump aracı .NET SDK gerektirir. Bu nedenle, dotnet-dump'ı yüklemeden önce .NET SDK'sını yüklemeniz gerekir. Daha önce açıklandığı gibi, .NET SDK'sını yüklemeden önce Microsoft paket imzalama anahtarını güvenilen anahtarlar listesine eklemeniz ve ardından SDK'yı yükleme bölümünde açıklandığı gibi paket deposunu eklemeniz gerekir. Aşağıdaki ekran görüntüsünde eylem adımlarına bakın.

BuggyAmb sudo.

Artık SDK'yı yükleme bölümünde açıklandığı gibi en son SDK'yı yeniden yüklemeye hazırsınız. Aşağıdaki ekran görüntüsünde, komutların sonucunu görüntüleyen Windows Terminali gösterilmektedir.

BuggyAmb sdk'sı.

Dotnet-dump kullanarak çekirdek döküm dosyasını açacaksınız. Bu nedenle, önce aracı yüklemeniz gerekir. Daha önce açıklandığı gibi, dotnet-dump'ı genel bir araç olarak yükleme komutudur dotnet tool install -g dotnet-dump.

BuggyAmb dotnet.

Yüklemenin ardından çekirdek döküm dosyalarını keşfetmeye başlamaya hazırsınız. dotnet-dump kullanarak çekirdek döküm dosyasını açın. Önceki laboratuvarda yaptığınız gibi aşağıdaki komutu çalıştırın:

dotnet-dump analyze ~/dumps/coredump.manual.1.11724

BuggyAmb çöplüğü.

Yönetilen iş parçacıklarını görüntülemek için çalıştırmayı clrthreads deneyin. Bu komutun başarısız olması ve aşağıdaki hata iletisini oluşturması beklenir.

BuggyAmb dump2.

Hata iletisi aşağıdaki gibidir:

mscordaccore.dll yüklenemiyor veya başlatılamıyor. Hedef çalışma zamanı başlatılamayabilir.

Gerekli .NET Core çalışma zamanı Linux VM'de yüklü olmadığından bu hata oluşur. Linux dökümlerinde hata ayıklama bölümünde açıklandığı gibi, .NET Core dökümlerini analiz etmek için hem LLDB hem de SOS, döküm dosyasının oluşturulduğu ortamdan aşağıdaki .NET Core ikili dosyalarını gerektirir:

  • libmscordaccore.so
  • libcoreclr.so
  • dotnet (uygulamayı başlatmak için kullanılan konak)

Döküm dosyalarını uygulamanın barındırıldığı ve çalıştırıldığı vm'de analiz ettiğiniz için bu, önceki sorun giderme laboratuvarlarında sorun oluşturmamıştı. Bu nedenle, dosyalar zaten vardı. Şimdi, bu dosyaların doğru sürümünü bir yerden kopyalamanız gerekir (örneğin, çekirdek döküm dosyalarının alındığı VM'den) veya aynı .NET çalışma zamanını WSL2 Linux VM'sine yüklemeniz gerekir.

Hedef .NET Core çalışma zamanını belirlemek için çeşitli yöntemler vardır. En kolayı, uygulama sahibine sormaktır. İsterseniz, sahibi sizseniz uygulamanın hedef .NET Core çalışma zamanını da bilirsiniz. Ya bu bilgiye hiç sahip değilsen? Bu durumda, işlemde yüklenen yerel modülleri listeleyen bir SOS uzantısı komutu lm veya moduleskullanabilirsiniz. .NET yüklemenizin sürümünü belirlemek için bu komutu çalıştırın.

BuggyAmb modülleri.

Bu ekran görüntüsünde gösterildiği gibi .NET Core çalışma zamanı sürümü 3.1.10'du. libmscordaccore.so, libcoreclr.so ve .NET'in doğru sürümüne ihtiyacınız vardır. Bu dosyaları, çekirdek döküm dosyalarının oluşturulduğu VM'den kopyalayabilirsiniz.

Aynı sonucu elde etmenin başka bir yolu var mı? Örneğin, bu dosyalara sahip olmak için .NET Core çalışma zamanı sürüm 3.1.10'u yükleyebilir misiniz? Kısa cevap evet, yapabilirsiniz. Ancak komutunu kullanarak sudo apt install dotnet-runtime-3.1.10 yükleyemezsiniz.

BuggyAmb apt.

Bunun yerine.NET Core çalışma zamanı 3.1'i yükleyebilirsiniz. Ancak bu sürüm, bu makalenin yazıldığı sırada en son .NET Core 3.1 sürümünü (.NET Core 3.1.15) yükler.

BuggyAmb yüklemesi.

Çekirdek döküm dosyası bir .NET Core 3.1.10 işlemi için olduğundan bu işlem çalışmaz. Bu gerekli dosyaların eşleşen sürümüne sahip olmanız gerekir.

Neyse ki, çekirdek döküm dosyalarında hata ayıklamak için gereken dosyaları (semboller, DAC, modüller vb.) indirebilen bir dotnet-symbol aracı vardır. Bu aracı önceki bölümlerden hatırlayabilirsiniz. Bu aracı yüklemek için komutunu çalıştırın dotnet tool install -g dotnet-symbol .

BuggyAmb aracı.

Şimdi dotnet-symbol aracından çekirdek döküm dosyamızı hedefleyen gerekli dosyaları indirmesini istemeniz gerekir. Bu, çekirdek döküm dosyası adını ve diğer gerekli parametreleri geçirir: dotnet-symbol --host-only --debugging ~/dumps/coredump.manual.1.11724.

BuggyAmb simgesi.

Listedeki son iki hatayı yoksayabilirsiniz. Gerekli dosyalar ~/dumps klasörüne indirilir.

BuggyAmb 2.

dotnet-dump kullanarak çekirdek döküm dosyasını açın ve aynı clrthreads komutları çalıştırmayı deneyin.

BuggyAmb clrthreads.

Artık WSL2 kullanarak Windows VM'nizde çekirdek döküm dosyasını açabiliyor olmanız gerekir.

Lldb'de döküm dosyalarını açma

Bu adımlar, önceki sorun giderme laboratuvarlarındaki adımlarla aynıdır. Dotnet-dump kullanarak çekirdek döküm dosyalarında hata ayıklamak için gerekli dosyaları almak için önemli bölümleri önceden ele almış olmanız gerekir. Yordam LLDB için aynıdır. Hata ayıklama için lldb'yi yüklemek ve kullanmak istiyorsanız, önceki laboratuvarları denetleyin.

dotnet-symbol gerekli dosyaları bulamıyorsa

Dotnet-symbol, çekirdek döküm dosyalarının çoğu için çalışır. Bir nedenden dolayı gerekli dosyaları indiremezse, engellemeyi geçici olarak gidermenin yolları vardır. İkili dosyaları resmi Microsoft web sayfasından indirebilir ve ayıklayabilirsiniz. Ardından, gerekli dosyaları çekirdek döküm dosyasını içeren aynı klasöre el ile kopyalayın.

Örneğin, .NET Core 3.1.10 x64 dosyalarına ihtiyacınız varsa, ikili dosyaları bu ASP.NET Core 3.1 Çalışma Zamanı (v3.1.10) - Linux x64 İkili dosyalar indirme sayfasından indirebilir ve dosyaları el ile kopyalayabilirsiniz:

  • .\shared\Microsoft.NETCore.App\3.1.10\libcoreclr.so
  • .\shared\Microsoft.NETCore.App\3.1.10\libmscordaccore.so
  • .\shared\Microsoft.NETCore.App\3.1.10\libmscordbi.so
  • .\shared\Microsoft.NETCore.App\3.1.10\
  • .\dotnet

Hedef çalışma zamanı sürümü özel bir sürümse (.NET Core'un açık kaynak olduğunu ve kendi özel sürümünüzü oluşturup kullanabileceğinizi unutmayın), bu dosyaları çekirdek döküm dosyasının oluşturulduğu Linux VM'den kopyalamanız gerekir.

Sonraki adımlar

Laboratuvar 4.3 Başka bir makinedeki çekirdek döküm dosyalarını analiz etme - Çekirdek döküm dosyalarını açmak için Docker kullanma