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 新发现,欢迎更新此文。