Código Go de depuração remota com VSCode sem desenvolvimento remoto

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:



  1. A assinatura automática de commits de GnuPG do VSCode não funcionou.
  2. O agente SSH não funcionou (provavelmente devido ao encaminhamento do agente desativado).
  3. 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.



Postagem TL; DR
  1. 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.
  2. Crie um perfil de depuração no VSCode que se conecta à máquina de destino.
  3. 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:



Processo de depuração em VSCode



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.



Links






All Articles