Remote Debug Go Code mit VSCode ohne Remoteentwicklung

Irgendwann wird es erforderlich, ein Programm zu debuggen, das auf einem funktionierenden Computer nicht debuggt werden kann. In meinem Fall musste ich ein Programm, das über D-Bus mit iwd , einem Daemon, der Wi-Fi-Verbindungen verwaltet , kommuniziert , auf einem Laptop debuggen .



VSCode verfügt über ein Remote Development- Add-On, das speziell für solche Fälle entwickelt wurde. Er passte aus mehreren Gründen nicht zu mir:



  1. Das automatische Signieren von GnuPG-Commits von VSCode hat nicht funktioniert.
  2. Der SSH-Agent funktionierte nicht (wahrscheinlich aufgrund einer deaktivierten Agentenweiterleitung).
  3. Es scheint, dass das Öffnen eines lokalen Verzeichnisses auf einem Remotecomputer, das in RD zu existieren schien, nicht funktioniert hat (einige der erforderlichen Dateien waren nicht in der Versionskontrolle enthalten, und ich wollte nicht jedes Mal manuell über das Netzwerk kopieren).


Ich schreibe in Go, also ist der Hack, den ich beschreiben werde, für den Delve- Debugger . Der Ansatz selbst ändert sich unabhängig von der Programmiersprache kaum. Ähnliches gilt für VSCode, der in Python ptvsd und jedem anderen Debugger verwendet wird, der Remoteverbindungen zulässt .



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


Scripting Delve Build and Run



Delve kann im Debug-Server-Modus arbeiten, sodass Clients eine Verbindung über das Netzwerk herstellen können.



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




Nachdem alles konfiguriert ist, können Sie F5 drücken. Eine Debugging-Sitzung wird gestartet:



Debugging-Prozess in VSCode



Diese Methode funktioniert, hat jedoch eine große Einschränkung: Das in VSCode integrierte Terminal zeigt nicht die Standard-E / A des zu debuggenden Prozesses an. Wenn Sie sie benötigen, können Sie nach dem Starten des Debuggens eine SSH-Verbindung zu der tmux-Sitzung herstellen, in der das Programm im Hintergrund ausgeführt wird.



Links






All Articles