一个计算机技术爱好者与学习者

0%

好好学Golang:VSCode配置Golang Debug

1. 前言

本文学习在VSCode中配置Golang Debug的方法,备忘。

参考资料:

2. 安装Golang环境

参考文档:好好学Golang:Golang入门篇

3. 安装Golang扩展和工具

使用Visual Studio Code的Go扩展,我们可以获得像IntelliSense、代码导航、符号搜索、测试、调试等许多功能,这些功能将帮助我们进行Go开发。

1、安装Golang扩展
点击侧边栏 Extensions ,搜索 Go ,点击 Install

2、安装Golang工具
command+shift+P,输入 Go: Install/Update tools,全部勾选,点击OK

安装过程Golang工具的过程,会显示在OUTPUT中。

3、检查Golang工具
command+shift+P,输入 Go: Locate Configured Go Tools,查看 Go Tools 是否都已经安装完成

PS:安装好Golang工具后,可以避免VSCode保存go文件时卡住问题。

1
Saving 'main.go': Getting code actions from ''Go'' (configure).

4. 配置Golang代理

安装过程Golang工具时,如果下载超时,那么需要配置Golang代理:

1
2
3
go env | grep GOPROXY
go env -w GOPROXY=https://goproxy.cn
go env | grep GOPROXY

这个配置,会写入到Golang环境变量配置文件中,对所有shell永久生效。

Golang环境变量配置文件可能的路径:

  • $(go env GOROOT)/go.env
  • $(go env GOPATH)/go.env
  • $(go env HOME)/go.env
  • $HOME/Library/Application Support/go/env

安装完成可以取消Golang代理:

1
go env -w GOPROXY=

对于单次shell配置Golang代理,可以参考goproxy.io快速上手

5. 配置调试

5.1. 创建 launch.json

1、点击VSCode左侧带虫子的三角形,进入RUN AND DEBUG页面
2、点击 create a launch.json file,选择 Go: Launch Package

5.2. 打开 launch.json

1、点击VSCode左侧带虫子的三角形,进入RUN AND DEBUG页面
2、点击齿轮,打开 launch.json 文件

或者,直接在项目中打开 .vscode/launch.json 文件

5.3. 配置 launch.json

假设程序启动命令为 go run main.go,那么配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${fileDirname}"
}
]
}

6. 启动调试

1、在代码中打断点

2、点击VSCode左侧带虫子的三角形,进入RUN AND DEBUG页面

3、点击齿轮左边的三角形,即可进入调试

7. 调试报错问题解决

7.1. 缺少 dlv 模块问题

点击调试,可能会报错:

1
The "dlv" command is not available. Run "go install -v github.com/go-delve/delve/cmd/dlv@latest" to install.

根据提示安装 dlv 即可:

1
go install -v github.com/go-delve/delve/cmd/dlv@latest

7.2. 缺少模块定义问题

点击调试,还可能会报错:

1
2
3
4
5
6
Starting: /Users/vk/git/go/bin/dlv dap --listen=127.0.0.1:63418 --log-dest=3 from /Users/vk/git/pod-data-restorer
DAP server listening at: 127.0.0.1:63418
Build Error: go build -o /Users/vk/git/pod-data-restorer/__debug_bin4228580289 -gcflags all=-N -l .
go: cannot find main module, but found .git/config in /Users/vk/git/pod-data-restorer
to create a module there, run:
go mod init (exit status 1)

这个错误信息表明这个 Go 项目缺少一个模块定义,即缺少 go.mod 文件。在 Go 1.11 版本及以后,推荐使用模块来管理项目的依赖。
解决办法:

1
2
cd /Users/vk/git/pod-data-restorer  
go mod init pod-data-restorer

8. VSCode调试Golang原理

VSCode调试Golang的原理主要依赖于一个叫做Delve(dlv)的开源工具,这是一个专门为Go语言设计的调试器。

  • Delve:Delve是用Go语言编写的调试器,可以理解为Go语言的gdb调试工具。其实现了GDB/MI调试引擎接口,并具有丰富的特性,如断点、单步执行、调用栈跟踪、查看变量值与内存状态等。VSCode通过调用Delve,并把Delve的结果展示在VSCode界面中。
  • VSCode Go插件:VSCode中提供了一款非常强大的Go语言插件,这个插件支持Delve调试。安装该插件后,用户可以在VSCode中进行断点设置、单步执行、查看变量值等Debug操作,插件内部调用Delve的相关命令去获取程序状态,并把结果反馈到VSCode界面中。
  • DAP:当用户启动Debug会话时,VSCode调用Delve启动一个调试服务器,然后VSCode会用一种叫Debugger Adapter Protocol的协议与这个服务器进行通信,通过这种方式对GPC程序进行推进、停顿、查看变量值等操作。

总的来说,VSCode调试Golang的原理,其实主要是VSCode、Go插件与Delve三者的协同工作。其中Delve在底层扮演了与Go程序交互的角色,VSCode和Go插件在上层提供了用户友好的交互接口。