0.前置条件
具备docker运行环境。
本人的环境是:在win10的wsl下安装了docker运行环境。配置可以参照:win10下wsl2(Ubuntu)搭建及docker安装、zsh&&cmder终端美化
简单流程:
- 在wsl下运行我构建的镜像,此时挂载win10下的代码目录到镜像中;
- 然后在镜像内部运行dlv debug相关命令
- 在win10下设置好goland,开启debug
- 触发请求,开始断点调试。
1.docker 镜像构建
- 注:如果不想自己build镜像也可以直接拉起我制作的镜像,只需要运行
docker pull 10xjzheng/my-go:v1.0
即可跳过下面的构建流程。 - 编写Dockerfile,内容如下:
FROM golang:1.14
# 设置go mod 代理
RUN go env -w GO111MODULE=on
RUN go env -w GOPROXY=https://goproxy.io,direct
RUN go get -v github.com/go-delve/delve/cmd/dlv
RUN dlv version
- 目录内容如下:
在当前目录执行:docker build -t 10xjzheng/my-go:v1.0 .
最后的点别丢了。 - 执行命令
docker images
可以看到build完的镜像。
2.运行demo
server.go
代码如下:
package main
import (
"fmt"
"log"
"net/http"
"strings"
)
func sayHelloWord(w http.ResponseWriter, r *http.Request) {
r.ParseForm() // 解析参数
fmt.Println(r.Form)
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("value", strings.Join(v, ""))
}
fmt.Fprintf(w, "hello world")
}
func main() {
http.HandleFunc("/hello", sayHelloWord) //设置访问路由
err := http.ListenAndServe(":9090", nil) // 设置监听端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
执行docker命令进入容器:
docker run -it -v "$PWD":"/go/src" -p 9090:9090 -p 2345:2345 10xjzheng/my-go:v1.0
# 我这里挂载的是我win10下的$GOAPTH/src目录,这里似乎需要保证远程被调试的代码和本地代码都必须在 $GOAPTH/src 目录下
然后执行:
dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient TestProject/server.go
# --accept-multiclient 参数的意思是:允许多个客户端连接
3.设置win10下的goland
开启调试后:
4.断点调试
运行命令:
curl http://localhost:9090/hello
大功告成: