引言:和PHP一样,虽然通过print的方式可以解决调试一部分代码,解决一些问题,但是总体效率并不高,而且有时候光看输入输出没办法排除一些代码逻辑问题,所以和所有强类型语言类型一样,所以通过断点,逐步调试还是很有必要的。

golang中调试需要借助调试组件delve

1、安装delve

go get -u github.com/derekparker/delve/cmd/dlv

2、使用dlv命令调试golang

a、我们写个test.go,代码如下:

package main

import "fmt"

func swap(x, y string) (string, string) {
   return y, x
}

func main() {
   a, b := swap("Mahesh", "Kumar")
   fmt.Println(a, b)
}

b、开始调试,在工程目录执行:

dlv debug test.go
进入调试模式后,输入hhelp可以看到dlv所有的调试命令,建议多多看看,理解了在开始调试,不然会无从下手,不懂的话,在调试过程中,也可以随时输入命令调出帮助命令。

c、添加一个断点,dlv可以设定断点在函数开始,如在main函数开头设定断点

(dlv) b main.main
Breakpoint 1 set at 0x10b7148 for main.main() ./test.go:8

在代码某一行设定断点,b 行号

(dlv) b 6
Breakpoint 2 set at 0x10b7100 for main.swap() ./test.go:6

d、输入c,开始执行

(dlv) c
> main.main() ./test.go:8 (hits goroutine(1):1 total:1) (PC: 0x10b7148)
     3:    import "fmt"
     4:
     5:    func swap(x, y string) (string, string) {
     6:       return y, x
     7:    }
=>   8:    func main() {
     9:       a, b := swap("Mahesh", "Kumar")
    10:       fmt.Println(a, b)
    11:    }

e、n 命令,单步执行

(dlv) n
> main.main() ./test.go:9 (PC: 0x10b715f)
     4:
     5:    func swap(x, y string) (string, string) {
     6:       return y, x
     7:    }
     8:    func main() {
=>   9:       a, b := swap("Mahesh", "Kumar")
    10:       fmt.Println(a, b)
    11:    }

f、常用命令

输入 n 回车,执行到下一行

输入 s 回车,单步执行

输入 c 回车,一直执行直到断点或者程序结束

输入 print(别名p)输出变量信息  

输入 args 打印出所有的方法参数信息

输入 locals 打印所有的本地变量
使用dlv命令行调试还是比较方便的,如果有过gdb调试经验的话,用起来应该是很顺手的。

3、使用IDE调试golang,以visual studio code为例

使用IDE之前也需要手动安装dlv,本质也是借助dlv进行调的

a、安装go扩展:vscode -> 查看 -> 扩展

b、配置启动项:vscode -> 查看 -> 调试, 添加配置项,举例如下

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "snow",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceRoot}/main.go", //启动文件或启动文件所在目录,默认是main.go
            "env": {
                "GO111MODULE":"on"
            },
            "args": [],
            "trace": "log",
            "showLog": true
        }
    ]
}

c、按 F5 启动调试,调试快捷键和Vistual Studio,调试界面非常友好,常用快捷键如下

F9 切换断点
F10 单步执行
F11 进入函数内部
Shift+F11 退出当前函数

开始执行后,在左侧面板可以看到当前local和global变量值,IDE调试非常方便
alt