0.前置條件
具備docker運(yùn)行環(huán)境。
本人的環(huán)境是:在win10的wsl下安裝了docker運(yùn)行環(huán)境。配置可以參照:win10下wsl2(Ubuntu)搭建及docker安裝、zsh&&cmder終端美化
簡(jiǎn)單流程:
- 在wsl下運(yùn)行我構(gòu)建的鏡像,此時(shí)掛載win10下的代碼目錄到鏡像中;
- 然后在鏡像內(nèi)部運(yùn)行dlv debug相關(guān)命令
- 在win10下設(shè)置好goland,開(kāi)啟debug
- 觸發(fā)請(qǐng)求,開(kāi)始斷點(diǎn)調(diào)試。
1.docker 鏡像構(gòu)建
- 注:如果不想自己build鏡像也可以直接拉起我制作的鏡像,只需要運(yùn)行
docker pull 10xjzheng/my-go:v1.0即可跳過(guò)下面的構(gòu)建流程。 - 編寫(xiě)Dockerfile,內(nèi)容如下:
FROM golang:1.14
# 設(shè)置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
- 目錄內(nèi)容如下:
image.png
在當(dāng)前目錄執(zhí)行:docker build -t 10xjzheng/my-go:v1.0 .最后的點(diǎn)別丟了。 - 執(zhí)行命令
docker images可以看到build完的鏡像。
image.png
2.運(yùn)行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) //設(shè)置訪問(wèn)路由
err := http.ListenAndServe(":9090", nil) // 設(shè)置監(jiān)聽(tīng)端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
執(zhí)行docker命令進(jìn)入容器:
docker run -it -v "$PWD":"/go/src" -p 9090:9090 -p 2345:2345 10xjzheng/my-go:v1.0
# 我這里掛載的是我win10下的$GOAPTH/src目錄,這里似乎需要保證遠(yuǎn)程被調(diào)試的代碼和本地代碼都必須在 $GOAPTH/src 目錄下
然后執(zhí)行:
dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient TestProject/server.go
# --accept-multiclient 參數(shù)的意思是:允許多個(gè)客戶(hù)端連接
3.設(shè)置win10下的goland

image.png

image.png

image.png

image.png

image.png

image.png
開(kāi)啟調(diào)試后:

image.png
4.斷點(diǎn)調(diào)試
運(yùn)行命令:
curl http://localhost:9090/hello
大功告成:

image.png

