في مرحلة ما ، تبدأ الحاجة إلى تصحيح أخطاء برنامج لا يمكن تصحيحه على جهاز كمبيوتر يعمل. في حالتي ، كنت بحاجة إلى تصحيح أخطاء برنامج يتصل عبر D-Bus مع iwd ، وهو برنامج خفي يدير اتصالات Wi-Fi ، على جهاز كمبيوتر محمول.
يحتوي VSCode على وظيفة إضافية للتطوير عن بُعد مصممة خصيصًا لمثل هذه الحالات. لم يناسبني لعدة أسباب:
- التوقيع التلقائي لالتزامات GnuPG من VSCode لم ينجح.
- لم يعمل وكيل SSH (ربما بسبب تعطيل إعادة توجيه الوكيل).
- يبدو أن فتح دليل محلي على جهاز بعيد ، والذي يبدو أنه موجود في RD ، لم ينجح (لم يتم تضمين بعض الملفات الضرورية في التحكم في الإصدار ، ولم أرغب في إجراء نسخ يدوي عبر الشبكة في كل مرة).
أنا أكتب في Go ، لذا فإن الاختراق الذي سأصفه هو لمصحح أخطاء Delve . النهج نفسه يتغير قليلاً بغض النظر عن لغة البرمجة ؛ يمكن عمل مماثل لـ VSCode المستخدم في Python ptvsd وأي مصحح أخطاء آخر يسمح بالاتصالات عن بُعد.
- نكتب نصًا يقوم ببناء ثنائي مع دعم التصحيح ، ونسخه إلى الجهاز الهدف عبر SCP وبدء Delve.
- قم بإنشاء ملف تعريف تصحيح أخطاء في VSCode والذي يتم إرفاقه بالجهاز الهدف.
- قم بإنشاء مهمة في VSCode تبدأ البرنامج النصي من الخطوة 1 وإضافته اعتمادًا على ملف تعريف التصحيح.
البرمجة النصية Delve Build and Run
يمكن أن يعمل Delve في وضع خادم التصحيح ، مما يسمح للعملاء بالاتصال عبر الشبكة.
لإكمال إجراء الإنشاء / التحميل / التشغيل بالكامل ، يمكنك كتابة برنامج نصي بسيط bash أو Makefile ، لكني أحب Taskfile أكثر لاستبدالها في مثل هذه الحالات ، لذلك سأقدم ملفي الخاص Taskfile.yml، والذي لا يختلف كثيرًا عن برنامج shell النصي وظيفيًا:
version: '2'
tasks:
killall:
cmds:
# Delve ,
# ,
#
- ssh target_machine killall dlv || true
push:
deps:
- killall
cmds:
#
- go build -gcflags="all=-N -l" -o ./build/debug_binary ./cmd/program
#
- scp ./build/debug_binary target_machine:/home/tdemin/Desktop/debug_binary
delve:
deps:
- push
cmds:
# dlv 64001;
# tmux ,
# dlv, & nohup
#
- ssh target_machine '(cd ~ && chmod +x Desktop/debug_binary && tmux new -d dlv --headless -l \[::\]:64001 exec ./Desktop/debug_binary)'
يمكن الآن بدء العملية برمتها بأمر task delve؛ الموضوعة في Taskfile.ymlالتبعيات تضمن إنهاء Delve (يجب أن يتم ذلك قبل SCP ، لأنه scpلن يسمح بالكتابة فوق الثنائي الذي يمكن قراءته بواسطة dlv في هذه اللحظة) ، وبناء / ملء وبدء عملية Delve جديدة في الخلفية على الجهاز الهدف.
إعداد ملف تعريف التصحيح
.vscode/launch.jsonسيبدو الملف الذي يحدد ملفات تعريف تصحيح الأخطاء كما يلي:
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to target",
// dlv API v1 ,
// --api-version
"apiVersion": 1,
"type": "go",
"request": "attach",
"mode": "remote",
// ; ,
// , ,
//
"remotePath": "${workspaceFolder}",
// ,
//
"preLaunchTask": "Run Delve on target",
"port": 64001,
"host": "target_machine"
}
]
}
.vscode/tasks.jsonستبدو مهمة التجميع المقابلة في الملف كما يلي:
{
"version": "2.0.0",
"tasks": [
{
// preLaunchTask launch.json
"label": "Run Delve on target",
"type": "shell",
// Taskfile
"command": "task delve",
"group": {
"kind": "test",
"isDefault": true
},
"presentation": {
//
// ,
"reveal": "silent"
}
}
]
}
تصحيح
بعد تكوين كل شيء ، يمكنك الضغط على F5 ، ستبدأ جلسة تصحيح الأخطاء:

تعمل هذه الطريقة ، ولكن لها قيد كبير: لا يُظهر الجهاز المدمج في VSCode الإدخال / الإخراج القياسي للعملية التي يتم تصحيحها. إذا كنت في حاجة إليها ، بعد بدء التصحيح ، يمكنك SSH إلى جلسة tmux التي يعمل فيها البرنامج في الخلفية.