Devle是一个很是棒的golang 调试工具,支持多种调试方式,直接运行调试,或者attach到一个正在运行中的golang程序,进行调试。html
线上golang服务出现问题时,Devle是必很多的在线调试工具,若是使用docker,也能够把Devle打进docker镜像里,调试代码。git
安装Devle很是简单,直接运行go get
便可:github
go get -u github.com/derekparker/delve/cmd/dlvgolang
若是你的go版本为1.5请先设置环境变量GO15VENDOREXPERIMENT=1再运行go get。个人go版本为1.10,不用设置。web
先写一个简单的web服务,而后使用Devle来进行调试。docker
在$GOPATH/src/github.com/mytest 文件夹下建立main.go服务器
package main import ( "fmt" "log" "net/http" "os" ) const port = "8000" func main() { http.HandleFunc("/hi", hi) fmt.Println("runing on port: " + port) log.Fatal(http.ListenAndServe(":" + port, nil)) } func hi(w http.ResponseWriter, r *http.Request) { hostName, _ := os.Hostname() fmt.Fprintf(w, "HostName: %s", hostName) }
简单吧,一个运行在8000端口上的web服务,访问 hi会返回机器的名称。上面代码的行号是颇有用的,等会咱们打断点的时候会用到。curl
使用Delve运行咱们的main.goide
dlv debug ./main.go工具
能够输入help来看一下帮助文档
很简单的一些命令
咱们先打在main方法上打一个断点:
b main.main
而后运行c 来运行到断点,
在func li 里打一个断点,咱们能够使用
b main.hi
或者使用 "文件:行号"来打断点b /home/goworkspace/src/github.com/mytest/main.go:20
如今执行continue 让服务跑起来。访问一下咱们的服务,看hi方法会不会停下来。
curl localhost:8000/hi
看到了没,在19行停下来了。
输入 n 回车,执行到下一行
输入s 回车,单步执行
输入 print(别名p)输出变量信息
输入 args 打印出全部的方法参数信息
其余的命令我就不在这里给你们演示了,本身动动手试一下。
使用Delve附加到运行的golang服务进行调试
先编译一下咱们的main.go而后去行main
go build main.go
./main
而后使用Delve附加到咱们的项目上,先看一下咱们的项目的pid
ps aux|grep main
dlv attach 29260
在hi方法里打断点,而后执行c来等待断点的执行。
b /home/goworkspace/src/github.com/mytest/main.go:20
访问咱们的服务器,看一下断点会不会被执行
curl localhost:8000/hi
断点执行了。而后调试你的代码吧!