快看!你的 golang 程序在干什么不可描述的事情

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

你可能感兴趣的:(快看!你的 golang 程序在干什么不可描述的事情)