Kubernetes'te çalışan ASP.NET Core web uygulamasıyla Visual Studio hata ayıklayıcısını mı kullanıyorsunuz?


9

Ekibimiz, ASP.NET uygulamamızın dahili Kubernetes kümemize konuşlandırılmış örneklerine karşı Visual Studio hata ayıklayıcısını çalıştırmak istiyor. Bulmacayı nasıl bitireceğimi bulmam gerekiyor, ancak Visual Studio 2019'a pek aşina değilim.

  • Docker görüntüsü resmi .NET Core görüntüleri ile derlenmiştir ve en son sürümle (/attach desteklemeyen) / vsdbg doldurulmuştur.
  • Visual Studio, Docker Masaüstü ile çalışır.
  • Kubectl doğru yapılandırılmış. Test için Docker Desktop'ta bulunan kubernetes kümesini veya dahili kubernetes kümemizi kullanabilirim.
  • Azure şu anda bir seçenek değil. Belgelerden Microsoft'un benim yapmamı tercih ettiği şeyin bu olduğunu anlıyorum.

Visual Studio'yu bunu yapabilmek için nasıl yapılandırmalıyım?


Selam. Neden ilk liste öğesinde "... var / vsdbg en son sürümle doldurulmuş (--attach desteklemiyor)" dediniz sormak istiyorum. ? Vsdbg'niz varsa; eki desteklemelidir.
Safak Ulusoy

@SafakUlusoy Yüklediğim vsdbg --attach bayrağını desteklemedi.
Thorbjørn Ravn Andersen

Yanıtlar:


4

Tamam. Hadi başlayalım. Öncelikle uygulamanızı Hata Ayıklama modunda yayınladığınızdan emin olun! Görüntülerimi oluşturmak için yeni bir Docker özelliği çok aşamalı derleme kullanmayı tercih ediyorum, böylece Dockerfile'daki bir oluşturma aşamasının sonunda böyle bir şey yazarım:

RUN dotnet publish -c Debug -o ./results

Minikube'ye görüntü aktarmak için burada anlatıldığı gibi yerel konteyner kayıt defterini kullanıyorum. Ama bunu genellikle yaptığınız gibi yapabilirsiniz. Konteynerinizi çalıştırıp çalıştırdığınızda, onu hacklemeye başlayabiliriz. Bu amaçla Powershell'i kullanacağım, ancak aynı şey başka bir terminal dilinde kolayca yeniden yazılabilir. Öğreticiyi adım adım takip edebilir ve gerektiğinde yankı komutuyla var'ın değerlerini kontrol ederek terminalinizdeki komutları birer birer uygulayabilirsiniz. * .Yml dosyanızda şöyle bir seçicinin tanımlanması gerekir:

selector:
  matchLabels:
    app: mywebapp

Yakalayın ve Powershell terminalinizde bir $ Selector var tanımlamak için kullanın:

$Selector = 'app=mywebapp'

Kapsayıcı uygulamanızın seçici tarafından çalıştığı bir kapsül bulmanız gerekir:

$pod = kubectl get pods --selector=$Selector -o jsonpath='{.items[0].metadata.name}';

Bölmede yalnızca bir kapsayıcı bulunduğunu varsayarsak, o kapsayıcıda komutları yürütebilirsiniz. Varsayılan olarak kapsayıcıda vsdbg yüklü değildir, bu yüzden devam edin ve yükleyin:

kubectl exec $pod -i -- apt-get update;
kubectl exec $pod -i -- apt-get install -y unzip;
kubectl exec $pod -i -- curl -sSL https://aka.ms/getvsdbgsh -o '/root/getvsdbg.sh';
kubectl exec $pod -i -- bash /root/getvsdbg.sh -v latest -l /vsdbg;

Ardından, kapsayıcı içinde uygulamanızın PID'sini bulmanız gerekir:

$prid = kubectl exec $pod -i -- pidof -s dotnet;

Normalde 1'e eşittir, ancak daha az varsayım yapmak daha iyidir. Bu kadar. Şimdi bir hata ayıklayıcı başlatabilirsiniz:

kubectl exec $pod -i -- /vsdbg/vsdbg --interpreter=mi --attach $prid;

Pencereyi kapatmadan önce aşağıdaki komutları çalıştırmayı unutmayın, aksi takdirde uygulamanız sonsuza kadar sıkışacaktır:

-target-detach
-gdb-exit

Her şeyi bir araya getirelim, yeniden kullanılabilir bir komut dosyası oluşturalım ve tüm ASP.NET Core projelerinizle kullanabileceğiniz için köklerin yakınında bir yere kaydedelim:

param(
    # the selector from your yml file
    #  selector:
    #    matchLabels:
    #      app: myweb
    # -Selector app=myweb
    [Parameter(Mandatory=$true)][string]$Selector
)

Write-Host '1. searching pod by selector:' $Selector '...';
$pod = kubectl get pods --selector=$Selector -o jsonpath='{.items[0].metadata.name}';

Write-Host '2. installing updates ...';
kubectl exec $pod -i -- apt-get update;

Write-Host '3. installing unzip ...';
kubectl exec $pod -i -- apt-get install -y --no-install-recommends unzip;

Write-Host '4. downloading getvsdbgsh ...';
kubectl exec $pod -i -- curl -sSL https://aka.ms/getvsdbgsh -o '/root/getvsdbg.sh';

Write-Host '5. installing vsdbg ...';
kubectl exec $pod -i -- bash /root/getvsdbg.sh -v latest -l /vsdbg;

$cmd = 'dotnet';
Write-Host '6. seaching for' $cmd 'process PID in pod:' $pod '...';
$prid = kubectl exec $pod -i -- pidof -s $cmd;

Write-Host '7. attaching debugger to process with PID:' $pid 'in pod:' $pod '...';
kubectl exec $pod -i -- /vsdbg/vsdbg --interpreter=mi --attach $prid;

Artık terminal komut dosyası klasöründen çalışırken bu komut dosyasını şu şekilde yürütebilirsiniz:

powershell -ExecutionPolicy Bypass -File kubedbg.ps1 -Selector app=mywebapp

Ancak Visual Studio'dan hata ayıklamamız gerekmiyor mu? Evet! Daha ileri gidip terminal sürecimizi Visual Studio MIEngine'den başlatalım. Projenizi Visual Studio'da açın. Aşağıdaki içeriğe sahip yeni bir XML dosyası ekleyin ve kubedbg.xml olarak adlandırın:


<PipeLaunchOptions xmlns="http://schemas.microsoft.com/vstudio/MDDDebuggerOptions/2014"
    PipePath="powershell" TargetArchitecture="x64" MIMode="clrdbg"
    PipeArguments="
      -ExecutionPolicy Bypass
      -File C:\kube\kubedbg.ps1
      -Selector app=mywebapp">
  <LaunchCompleteCommand>None</LaunchCompleteCommand>
</PipeLaunchOptions>

Gelen -Fileparametresi biz önce oluşturulan komut dosyanın mutlak yolunu belirtmeniz gerekir. Sonra Ctrl + Alt + A tuşlarına basarak Komut Penceresini açın ve aşağıdaki komutu çalıştırın: Debug.MIDebugLaunch /Executable:dotnet /OptionsFile:absolute_path_to_kubedbg_xml Bu komut, Visual Studio içindeki tüm hata ayıklama işlemini beklediğiniz tüm standart avantajlarla başlatır. Ancak hata ayıklamayı, Hata Ayıklama menüsünden Tümünü Ayır'a basmaktan başka bir şekilde durdurmayın! Bu komut her zaman yazmak için çok uygun olmasa da. Neyse ki Visual Studio'da, parametrelerle komutlar için diğer adlar belirtebilirsiniz. Sonunda, kubedbg.xmlher proje için yeni bir dosyaya ihtiyacınız olacak . Bunu göz önünde bulundurarak devam edin ve Komut Penceresine aşağıdaki komutu yazarak ilk takma adınızı oluşturun:

alias kubedbg.mywebapp Debug.MIDebugLaunch /Executable:dotnet 
/OptionsFile:absolute_path_to_kubedbg.xml

Bundan sonra, sadece Komut Penceresinde kubedbg.mywebapp komutunu çalıştırarak hata ayıklamaya başlayabilirsiniz. Daha da iyisi, Bul araç çubuğu Açılan Kutusundan aynı komutu ancak önekiyle çalıştırabilirsiniz: >kubedbg.mywebapp.Bu bir metin tamamlama olduğundan da zor değil. Komut diğer adları hakkında daha fazla bilgiyi buradan edinebilirsiniz. Mutlu hata ayıklama! Not: Bonus olarak kesinlikle aynı şekilde, genel bulutta çalışırken bile uygulamanızda hata ayıklayabilirsiniz. Kubectl genel buluttaki bir kümeye atandığında, aynı komut dosyasıyla çalışır ve gerçek küme işlem kimliği içinde eşit olmadığı için daha az varsayım yapar. 1


Çok kapsamlı bir cevap için teşekkür ederim. Bunu görmek --attachbayrağı bana biraz ilgilidir ayıklayıcısını, takmak için kullanılan kubectl komutu kullanılır. Bu yanıtı hazırlarken bunun sizin için çalıştığını doğrulayabilir misiniz?
Thorbjørn Ravn Andersen

Evet, gerçekten benim için çalıştı! Ama neden senin için işe yaramadığını bilmiyorum.
devcass

Bunun sizin için çalıştığını onayladığınız için teşekkür ederiz. Bunu yarın deneyeceğim.
Thorbjørn Ravn Andersen

Rica ederim! İyi şanslar! Bir şeye ihtiyacınız varsa buradayım
devcass
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.