快看!你的 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 新发现,欢迎更新此文。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用Xc...
    小笨狼阅读 20,714评论 31 186
  • LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用Xc...
    CoderSC阅读 1,421评论 0 2
  • 对于开发的同学来讲,Debug并不陌生,对于做Android开发的同学也是一样的。 可能有些同学会问,调试程序谁不...
    点融黑帮阅读 5,528评论 3 6
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,539评论 25 709
  • 简介 Sublime使用ctrl+shift+p实时查看markdown效果 By举子 1. 更好的学习文档 简书...
    举子7先生阅读 351评论 1 1