Em algum ponto, começa a ser necessário depurar um programa que não pode ser depurado em um computador em funcionamento. No meu caso, precisei depurar um programa que se comunica via D-Bus com o iwd , um daemon que gerencia conexões Wi-Fi, em um laptop.
O VSCode tem um complemento de desenvolvimento remoto projetado especificamente para esses casos. Ele não combinava comigo por vários motivos:
- A assinatura automática de commits de GnuPG do VSCode não funcionou.
- O agente SSH não funcionou (provavelmente devido ao encaminhamento do agente desativado).
- Parece que a abertura de um diretório local em uma máquina remota, que parecia existir no RD, não funcionou (alguns dos arquivos necessários não foram incluídos no controle de versão, e eu não queria fazer cópia manual pela rede todas as vezes).
Eu escrevo em Go, então o hack que vou descrever é para o depurador Delve . A abordagem em si muda pouco, independentemente da linguagem de programação; semelhante pode ser feito para VSCode usado em Python ptvsd e qualquer outro depurador permitindo conexões remotas.
- Escrevemos um script que constrói um binário com suporte para depuração, copia-o para a máquina de destino via SCP e inicia o Delve.
- Crie um perfil de depuração no VSCode que se conecta à máquina de destino.
- Crie uma tarefa em VSCode que inicie o script da etapa 1 e adicione-a dependendo do perfil de depuração.
Criação e execução do Scripting Delve
O Delve pode funcionar no modo de servidor de depuração, permitindo que os clientes se conectem pela rede.
// 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"
}
}
]
}
Depois que tudo estiver configurado, você pode pressionar F5, uma sessão de depuração será iniciada:

Esse método funciona, mas tem uma grande limitação: o terminal embutido no VSCode não mostra a E / S padrão do processo que está sendo depurado. Se eles forem necessários, após iniciar a depuração, você pode SSH para a sessão tmux na qual o programa está sendo executado em segundo plano.