Pada titik tertentu, Anda mulai perlu men-debug program yang tidak dapat di-debug pada komputer yang berfungsi. Dalam kasus saya, saya perlu men-debug program yang berkomunikasi melalui D-Bus dengan iwd , daemon yang mengelola koneksi Wi-Fi, di laptop.
VSCode memiliki add-on Pengembangan Jarak Jauh yang dirancang khusus untuk kasus seperti itu. Dia tidak cocok untuk saya karena beberapa alasan:
- Penandatanganan otomatis GnuPG komit dari VSCode tidak berfungsi.
- Agen SSH tidak berfungsi (mungkin karena penerusan agen dinonaktifkan).
- Tampaknya pembukaan direktori lokal pada mesin jarak jauh, yang tampaknya ada di RD, tidak berfungsi (beberapa file yang diperlukan tidak disertakan dalam kontrol versi, dan saya tidak ingin melakukan penyalinan manual melalui jaringan setiap saat).
Saya menulis di Go, jadi peretasan yang akan saya jelaskan adalah untuk debugger Delve . Pendekatan itu sendiri tidak banyak berubah terlepas dari bahasa pemrogramannya; serupa dapat dilakukan untuk VSCode yang digunakan dalam Python ptvsd dan debugger lain yang mengizinkan koneksi jarak jauh.
- Kami menulis skrip yang membangun biner dengan dukungan debugging, menyalinnya ke mesin target melalui SCP dan memulai Delve.
- Buat profil debug di VSCode yang dilampirkan ke mesin target.
- Buat tugas di VSCode yang menjalankan skrip dari langkah 1 dan tambahkan tergantung pada profil debug.
Scripting Delve Build and Run
Delve dapat bekerja dalam mode debug server, memungkinkan klien untuk terhubung melalui jaringan.
// dlv 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"
}
}
]
}
Setelah semuanya dikonfigurasi, Anda dapat menekan F5, sesi debugging akan dimulai:

Metode ini berfungsi, tetapi memiliki satu batasan besar: terminal yang dibangun ke dalam VSCode tidak menunjukkan I / O standar dari proses yang sedang di-debug. Jika diperlukan, setelah memulai debugging, Anda dapat SSH ke sesi tmux tempat program berjalan di latar belakang.