VS Code 断点调试golang

ucmir183 · · 5272 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

实现效果

安装 delve

windows

go get -u github.com/go-delve/delve/cmd/dlv

linux

方式一:
go get -u github.com/go-delve/delve/cmd/dlv
方式二

$ 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
注意: 若果你go版本为1.5需要设置GO15VENDOREXPERIMENT=1

OSX

$ go get -u github.com/go-delve/delve/cmd/dlv

执行上述代码前,确保你电脑上有编译工具

设置 launch.json 配置文件

ctrl+shift+p 输入 Debug: Open launch.json 打开 launch.json 文件,如果第一次打开,会新建一个配置文件,默认配置内容如下

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}",
            "env": {},
            "args": []
        }
    ]
}

常见属性如下

属性 介绍
name 调试界面下拉选择项的名称
type 设置为go无需改动,是 vs code 用于计算调试代码需要用哪个扩展
mode 可以设置为 auto, debug, remote, test, exec 中的一个
program 调试程序的路径(绝对路径)
env 调试时使用的环境变量。例如:{ "ENVNAME": "ENVVALUE" }
envFile 包含环境变量文件的绝对路径,在 env 中设置的属性会覆盖 envFile 中的配置
args 传给正在调试程序命令行参数数组
showLog 布尔值,是否将调试信息输出
logOutput 配置调试输出的组件(debugger, gdbwire, lldbout, debuglineerr, rpc),使用,分隔, showLog 设置为 true 时,此项配置生效
buildFlags 构建 go 程序时传给 go 编译器的标志
remotePath 远程调试程序的绝对路径,当 mode 设置为 remote 时有效

在 debug 配置中使用 VS Code 变量

  • ${workspaceFolder} 调试 VS Code 打开工作空间的根目录下的所有文件
  • ${file} 调试当前文件
  • ${fileDirname} 调试当前文件所在目录下的所有文件

使用构建标记(build tags)

如果需要使用构建标记(e.g. go build -tags=whatever_tag)在参数 buildFlags 里写入 -tags=whatever_tag" 即可,支持多标签,使用单引号将标签包围,例如: "-tags='first_tag second_tag third_tag'"

debug 配置代码片段

可以在 launch.json 文件中,使用 Go 关键词调出 debug 配置项的代码片段。

调试当前文件配置片段

{
    "name": "Launch file",
    "type": "go",
    "request": "launch",
    "mode": "auto",
    "program": "${file}"
}

调试单个测试用例配置片段

{
    "name": "Launch test function",
    "type": "go",
    "request": "launch",
    "mode": "test",
    "program": "${workspaceFolder}",
    "args": [
        "-test.run",
        "MyTestFunction"
    ]
}

调试包中所有的测试用例配置片段

{
    "name": "Launch test package",
    "type": "go",
    "request": "launch",
    "mode": "test",
    "program": "${workspaceFolder}"
}

调试构建二进制文件配置片段

{
    "name": "Launch executable",
    "type": "go",
    "request": "launch",
    "mode": "exec",
    "program": "absolute-path-to-the-executable"
}

远程调试

远程调试需要在服务器上期一个无头的 Delve 服务
例如:

$ dlv debug --headless --listen=:2345 --log --api-version=2

如果需要传给参数到程序中则需要将参数传入到 Delve 服务中
例如:

dlv debug --headless --listen=:2345 --log -- -myArg=123

launch.json 配置如下:

{
    "name": "Launch remote",
    "type": "go",
    "request": "launch",
    "mode": "remote",
    "remotePath": "服务器调试文件的目录(绝对路径)",
    "port": 2345,
    "host": "127.0.0.1",
    "program": "本地调试文件所在的目录(绝对路径)",
    "env": {}
}
  • 将上述配置中的 hostport 修改 Delve 服务所在的服务器ip和其监听的端口号。
  • remotePath 应该配置为调试文件的绝对路径
  • program 需要配置本地机器文件所在的绝对路径,是 remotePath 的一个副本

配置完成后,点击调试按钮,VS Code 将会项远程的 dlv 服务发出调试指令,而不是使用本机的 dlv 实例。

参考链接

Debugging Go code using VS Code
Delve Installation


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:ucmir183

查看原文:VS Code 断点调试golang

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5272 次点击  
加入收藏 微博
5 回复  |  直到 2019-05-06 15:51:51
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传