zoukankan      html  css  js  c++  java
  • 利用delve(dlv)在Visual Code中进行go程序的远程调试-debug方式

    最近碰到一个问题,如何在Windows的IDE或者文本编辑器上,远程调试Linux服务器上的golang程序。

    虽然想说gdb走你,但既然go有dlv这样的类似Java的jdwp的原生方案,而且我用的Visual Code的官方Go插件支持这种方案,那就试一下这个方案吧。

    2019-03-15追加:dlv支持debug、attach和exec三种方式。其中,debug是需要重新编译源代码的,后面两种不需要。也因此debug更适合开发阶段那种“写几个函数,F5一下看看能不能动”的场景,也是Visual Code官方文档记述的远程调试go的唯一方式。这篇文章讲述的是dlv debug这个方式,后续两个方式将在后续发出。

    环境

    • 近端
    • Win7 64bit
    • Visual Code 1.32.1 x64
    • Go 1.10
    • 远端
    • OpenSuSE 42.1
    • Go 1.10
    • git 2.12.3
    • 示例项目
    • hello/main.go,内容如下
    package main
    
    import "fmt"
    
    var globalVar int
    
    func main() {
        globalVar = 2
        localVar := 1
        globalVar++
        localVar++
        fmt.Printf("%v + %v = %v
    ", globalVar, localVar, globalVar+localVar)
    }
    

    准备01. 部署远端dlv

    首先远端需要先装好go、git和make的编译全家桶。然后设置好GOPATH,在这里我把/root/go作为这次的GOPATH。

    export GOPATH=/root/go
    

    然后从github.com上下载dlv下来,将dlv编译(make)出来后,将编译好的dlv加入可执行文件搜索路径(PATH)中。

    git clone https://github.com/go-delve/delve.git $GOPATH/src/github.com/go-delve/delve
    cd $GOPATH/src/github.com/go-delve/delve
    make install
    export PATH=$PATH:$GOPATH/bin
    

    这时候,执行dlv version应该能看到下面的类似信息(版本和Build随版本不同而不一样)。

    Delve Debugger
    Version: 1.2.0
    Build: ac3b1c7a786d681a5aefcdded9888090d69b3832
    

    准备02. 部署近端dlv

    近端可以直接用go来安装dlv,也可以使用Visual Code的Go插件来安装,Visual Code都能识别。这里使用的是Go插件的方法。

    在Visual Code的菜单栏上,通过View->Command Palette打开Visual Code的命令界面,输入>Go:install/update Tools后回车,就能看到选择安装哪个go工具的菜单。选中dlv后,点击OK按钮,就会自动安装了。安装过程以及提示信息可以在OUTPUT窗口查看。

     
    install_dlv_on_VCode

    准备03. 添加debug方案

    另外,需要给Visual Code添加对应的debug方案(debug configuration)。在Visual Code的菜单栏上,通过Debug->Open Configurations打开launch.json的编辑界面。在configurations数组中,加入以下内容后,保存文件。

    {
        "name": "Launch remote",
        "type": "go",
        "request": "launch",
        "mode": "remote",
        "remotePath": "/root/go/src/hello",
        "port": 2345,
        "host": "192.168.33.123",
        "program": "${fileDirname}",
        "env": {}
    }
    

    现在,我们就完成了远程调试的所有必须准备了。

    执行方法

    dlv的debug远程调试需要远端和近端都持有全部的源代码文件。为了方便,这里就不改变GOPATH,在远端直接将整个项目,扔到$GOPATH/src里面,源代码文件路径为$GOPATH/src/hello/main.go;在近端,直接创建hello目录,就把源代码文件直接放在里面。

    首先,我们需要先到项目里,启动dlv的服务端。

    cd $GOPATH/src/hello
    dlv debug --headless --listen ":2345" --log --api-version 2
    

    画面显示以下内容则说明dlv服务端已经就绪。

    API server listening at: [::]:2345
    INFO[0004] launching process with args: [/root/go/src/hello/debug]  layer=debugger
    

    然后,回到Visual Code进入debug界面,选择“Launch remote”方案后,点击启动来进行go debugger,就能启动远程调试。大部分的操作和本地调试无异,堆栈、变量、watch都能正常使用。

     
    run_debug_in_VCode.gif

    总结

    通过Visual Code+dlv来进行go程序的远程调试,对“开发用Windows,生产用Linux”之类的场合下,调试与系统相关的问题非常有帮助。而且,Visual Code的图形界面和代码提示实在是相当方便。

    但是debug这个做法有两点不完善的地方。第一个是它原理上需要远端对源代码进行编译,局限了它在除了开发测试环境外的使用场景,也使得每次调试都得等它编译;另一个是因为远端和近端都得有相同的源代码,无论是dlv还是Visual Code的Go插件,目前都没法自动将本地改动过的代码上传到远端去,因此无法实现“F5走你”的一键操作,手工工序太多,使得“debug驱动开发”(笑,虽然不鼓励,但无法消灭啊)的模式难以开展。

    所以,最好还是乖乖装个Linux桌面本地调试吧。

    参考

    delve官方项目
    Visual Code的go的debug官方帮助
    Visual Code的预定义变量清单

  • 相关阅读:
    2017.4.6下午
    2017.4.6上午
    2017.3.31下午
    2017.4.5下午
    2017.4.5上午
    2017.4.1上午
    2017.3.31上午
    2017.3.28下午
    2017.3.28上午
    3.28上午
  • 原文地址:https://www.cnblogs.com/ExMan/p/11460587.html
Copyright © 2011-2022 走看看