0.前置條件
具備docker運行環(huán)境。
本人的環(huán)境是:在win10的wsl下安裝了docker運行環(huán)境。配置可以參照:win10下wsl2(Ubuntu)搭建及docker安裝、zsh&&cmder終端美化
簡單流程:
- 在wsl下運行我構建的鏡像,此時掛載win10下的代碼目錄到鏡像中;
- 然后在鏡像內部運行dlv debug相關命令
- 在win10下設置好goland,開啟debug
- 觸發(fā)請求,開始斷點調試。
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
- 目錄內容如下:
image.png
在當前目錄執(zhí)行:docker build -t 10xjzheng/my-go:v1.0 .最后的點別丟了。 - 執(zhí)行命令
docker images可以看到build完的鏡像。
image.png
2.運行demo
server.go 代碼如下:
package main
import (
"fmt"
"log"
"net/http"
"strings"
)
func sayHelloWord(w http.ResponseWriter, r *http.Request) {
r.ParseForm() // 解析參數(shù)
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) // 設置監(jiān)聽端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
執(zhí)行docker命令進入容器:
docker run -it -v "$PWD":"/go/src" -p 9090:9090 -p 2345:2345 10xjzheng/my-go:v1.0
# 我這里掛載的是我win10下的$GOAPTH/src目錄,這里似乎需要保證遠程被調試的代碼和本地代碼都必須在 $GOAPTH/src 目錄下
然后執(zhí)行:
dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient TestProject/server.go
# --accept-multiclient 參數(shù)的意思是:允許多個客戶端連接
3.設置win10下的goland

image.png

image.png

image.png

image.png

image.png

image.png
開啟調試后:

image.png
4.斷點調試
運行命令:
curl http://localhost:9090/hello
大功告成:

image.png

