0x0 起因
在一次优化中,增加了按 seller 自动启动 goroutine 的功能,维护着一个 seller map 将协程 ID 都存入其中,发现这个 seller 没有 goroutine 就自动启动一个。 当时因为 map 没有加同步锁,而且是 goroutine 使用 fmt.Print 调试,各种几千个重复 print 真是受够了(谁试谁知道),一个正常的人马上得精神病。是时候祭出大杀器 VSCode Debug 工具。
0x1 给 VSCode 安装 debug 包
Debug 估计大家不用陌生,就是通过设置断点查看代码的执行情况,在 golang 有一个 debug 包 delve 可以很方便的结合 VSCode 调试。
go get -u github.com/derekparker/delve/cmd/dlv
0x2 设置断点
假如我们要 debug 下面这段代码
package main
import "fmt"
var a string
func init() {
a = "a string"
}
func main() {
b := "b string"
fmt.Printf("%s\n%s", a, b)
for i := 1; i < 5; i++ {
fmt.Println(i)
}
fmt.Println("Done")
}
把断点打在函数起始行

0x3 开始调试
按下 F5 启动调试(或者找到菜单 - 调试 - 启动调试), 调试开始你在 VSCode 上方能看到一个调试控制台,

分别是:
- 继续:继续运行直到遇到下个断点
- 单步跳过:跳过此行
- 单步调试:代码往下执行,深入调试(可跨文件)
- 单步跳出:跳出当前调试函数
- 重启:重新启动调试
- 停止:停止调试

0x4 查看调试信息
上面动图已经完成了完整的一次简单调试,那么通过上面的调试我们可以看到什么样的信息呢?
- 局部变量
当前作用域的所有局部变量。

- 全局变量
在监视面板添加你需要监视的全局变量。

- 堆栈信息
暂时跳过,里面信息还看不懂。

- 调试信息。

0x5 高级功能
- 条件断点
顾名思义,当达到指定条件之后才会触发断点,貌似 golang 暂时还不支持下次补上
0x6 尾声
Cool,恭喜你。学会了偷看你的 golang 脚本干的羞羞事情,那么其他语言遇到了类似情况,你已经知道怎么做了。如果你有 Debug 新发现,欢迎更新此文。
网友评论