Código Go de depuración remota con VSCode sin desarrollo remoto

En algún momento, comienza a ser necesario depurar un programa que no se puede depurar en una computadora en funcionamiento. En mi caso, necesitaba depurar un programa que se comunica a través de D-Bus con iwd , el demonio que administra las conexiones Wi-Fi, en una computadora portátil.



VSCode tiene un complemento de desarrollo remoto diseñado específicamente para tales casos. No me convenía por varias razones:



  1. La firma automática de confirmaciones de GnuPG desde VSCode no funcionó.
  2. El agente SSH no funcionó (probablemente debido al reenvío del agente desactivado).
  3. Parecía que la apertura de un directorio local en una máquina remota, que parecía existir en RD, no funcionaba (algunos de los archivos necesarios no estaban incluidos en el control de versiones y no quería hacer copias manuales a través de la red cada vez).


Escribo en Go, por lo que el truco que voy a describir es para el depurador de Delve . El enfoque en sí cambia poco independientemente del lenguaje de programación; Se puede hacer algo similar para VSCode usado en Python ptvsd y cualquier otro depurador que permita conexiones remotas.



TL; puesto DR
  1. , , SCP Delve.
  2. VSCode , .
  3. VSCode , .1 .


Scripting Delve Build and Run



Delve puede funcionar en modo de servidor de depuración, lo que permite a los clientes conectarse a través de la red.



// 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"
            }
        }
    ]
}




Después de que todo esté configurado, puede presionar F5, se iniciará una sesión de depuración:



Proceso de depuración en VSCode



Este método funciona, pero tiene una gran limitación: el terminal integrado en VSCode no muestra la E / S estándar del proceso que se está depurando. Si los necesita, después de comenzar a depurar, puede SSH a la sesión tmux en la que el programa se está ejecutando en segundo plano.



Enlaces






All Articles