ตกลง. เริ่มกันเลย ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณได้เผยแพร่แอพของคุณในโหมดดีบั๊กแล้ว! ฉันชอบที่จะใช้คุณสมบัติ Docker แบบใหม่ที่มีหลายขั้นตอนสำหรับการสร้างภาพของฉันดังนั้นฉันจะเขียนแบบนี้ในตอนท้ายของการสร้างใน Dockerfile:
RUN dotnet publish -c Debug -o ./results
ในการส่งภาพไปยัง Minikube ฉันจะใช้การลงทะเบียนคอนเทนเนอร์ภายในเครื่องตามที่อธิบายไว้ที่นี่ แต่คุณสามารถทำได้ตามปกติ เมื่อคุณมีคอนเทนเนอร์ของคุณและทำงานเราสามารถเริ่มแฮ็คมันได้ ฉันจะใช้ Powershell เพื่อจุดประสงค์นั้น แต่สามารถเขียนใหม่ได้อย่างง่ายดายในภาษาเทอร์มินัลอื่น ๆ คุณสามารถทำตามขั้นตอนการสอนตามขั้นตอนและดำเนินการคำสั่งในเทอร์มินัลของคุณทีละคนตรวจสอบค่าของ var ด้วยคำสั่ง echo เมื่อจำเป็น ในไฟล์ * .yml ของคุณคุณควรมีตัวเลือกที่อธิบายบางสิ่งดังนี้:
selector:
matchLabels:
app: mywebapp
คว้ามาและใช้เพื่อกำหนด $ Selector var ในเทอร์มินัล Powershell ของคุณ:
$Selector = 'app=mywebapp'
คุณต้องการค้นหาพ็อดที่แอปพลิเคชั่นคอนเทนเนอร์ของคุณทำงานโดยตัวเลือก:
$pod = kubectl get pods --selector=$Selector -o jsonpath='{.items[0].metadata.name}';
สมมติว่าคุณมีเพียงหนึ่งคอนเทนเนอร์ในพ็อดตอนนี้คุณสามารถดำเนินการคำสั่งบนคอนเทนเนอร์นั้นได้ โดยคอนเทนเนอร์เริ่มต้นไม่ได้ติดตั้ง vsdbg ดังนั้นให้ดำเนินการต่อและติดตั้ง:
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;
ถัดไปคุณต้องค้นหา PID ของแอปของคุณภายในคอนเทนเนอร์:
$prid = kubectl exec $pod -i -- pidof -s dotnet;
โดยปกติแล้วจะเท่ากับ 1 แต่จะดีกว่าที่จะทำให้สมมติฐานน้อยลง แค่นั้นแหละ. ตอนนี้คุณสามารถเริ่มโปรแกรมดีบั๊ก:
kubectl exec $pod -i -- /vsdbg/vsdbg --interpreter=mi --attach $prid;
อย่าลืมรันคำสั่งต่อไปนี้ก่อนที่คุณจะปิดหน้าต่างมิฉะนั้นแอพของคุณจะติดตลอดไป:
-target-detach
-gdb-exit
ลองรวบรวมทุกอย่างเข้าด้วยกันสร้างสคริปต์ที่นำมาใช้ซ้ำได้และบันทึกไว้ที่ใดที่หนึ่งใกล้กับรูทเนื่องจากคุณสามารถใช้มันกับโปรเจ็กต์ ASP.NET Core ทั้งหมดของคุณ:
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;
ตอนนี้คุณสามารถรันสคริปต์นี้เช่นนี้เมื่อเทอร์มินัลกำลังรันจากโฟลเดอร์สคริปต์:
powershell -ExecutionPolicy Bypass -File kubedbg.ps1 -Selector app=mywebapp
แต่เราไม่ควรที่จะทำการดีบั๊กจาก Visual Studio? ใช่ ไปต่อและเริ่มกระบวนการเทอร์มินัลจาก Visual Studio MIEngine เปิดโครงการของคุณใน Visual Studio เพิ่มไฟล์ XML ใหม่ด้วยเนื้อหาต่อไปนี้และตั้งชื่อ kubedbg.xml:
<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>
ใน-File
พารามิเตอร์คุณต้องระบุเส้นทางที่แน่นอนไปยังไฟล์สคริปต์ที่เราสร้างขึ้นก่อน จากนั้นกด Ctrl + Alt + A เพื่อเปิดหน้าต่างคำสั่งและเรียกใช้คำสั่งต่อไปนี้:
Debug.MIDebugLaunch /Executable:dotnet /OptionsFile:absolute_path_to_kubedbg_xml
คำสั่งนี้จะเริ่มต้นกระบวนการดีบักภายใน Visual Studio พร้อมผลประโยชน์มาตรฐานทั้งหมดที่คุณคาดหวัง แต่อย่าหยุดการดีบั๊กด้วยวิธีอื่นใดโดยการกด Detach All จาก Debug menu! แม้ว่าคำสั่งนี้จะไม่สะดวกในการเขียนตลอดเวลา โชคดีใน Visual Studio คุณสามารถระบุนามแฝงสำหรับคำสั่งด้วยพารามิเตอร์ ในที่สุดคุณจะต้องมีkubedbg.xml
ไฟล์ใหม่สำหรับแต่ละโครงการ ด้วยสิ่งนี้ในใจไปข้างหน้าและสร้างนามแฝงแรกของคุณโดยพิมพ์คำสั่งต่อไปนี้ในหน้าต่างคำสั่ง:
alias kubedbg.mywebapp Debug.MIDebugLaunch /Executable:dotnet
/OptionsFile:absolute_path_to_kubedbg.xml
หลังจากนั้นคุณสามารถเริ่มต้นการดีบักเพียงดำเนินการ kubedbg.mywebapp ในหน้าต่างคำสั่ง ยิ่งไปกว่านั้นคุณสามารถเรียกใช้คำสั่งเดียวกันจากแถบเครื่องมือค้นหา Combobox แต่มีคำนำหน้า: >kubedbg.mywebapp.
นั่นก็ไม่ยากเพราะมีการเติมข้อความด้วยเช่นกัน คุณสามารถอ่านเพิ่มเติมเกี่ยวกับชื่อแทนคำสั่งได้ที่นี่ การแก้ไขข้อบกพร่องมีความสุข! PS: เป็นโบนัสอย่างเดียวกับที่คุณสามารถตรวจแก้จุดบกพร่องแอปของคุณแม้ว่าจะทำงานในระบบคลาวด์สาธารณะ เมื่อ kubectl ถูกกำหนดให้กับคลัสเตอร์ในคลาวด์สาธารณะมันจะทำงานกับสคริปต์เดียวกันและทำให้มีการจ่ายคืนสมมติฐานน้อยลงเนื่องจากภายใน ID กระบวนการของคลัสเตอร์จริงไม่เท่ากับ 1