构建镜像
通过Dockerfile源代码,同时安装dlv:
FROM golang:1.22.4 as build
# 安装Dlv工具
RUN go env -w GOPROXY=https://goproxy.cn,direct
RUN go install github.com/go-delve/delve/cmd/dlv@v1.23
WORKDIR /src
COPY . .
# 编译时使用gcflags参数,阻止优化
RUN go build -gcflags="all=-N -l" -o /app .
FROM ubuntu:22.04 as deploy
# 方便运行dlv调试命令
RUN echo "ps aux | grep '/app\$' | grep -v /bin | awk '{print \$2}' | xargs /dlv attach --listen=:2345 --headless=true --api-version=2" > debug.sh
COPY --from=build /go/bin/dlv /
COPY --from=build /app /
# dlv调试端口
EXPOSE 2345
# 编译运行
CMD /app
运行程序
docker run --rm --name go_debug_demo -p 2345:2345 <image_name>
启动附加进程服务
docker exec -it go_debug_demo sh /debug.sh
本机连接调试器,附加进程
1. 使用dlv原生工具
dlv connect [ip]:2345
2. 使用vscode连接
-
项目根目录配置
launch.jsonporthost正常配,注意注释掉remotePath这一项
"configurations": [ { "name": "Connect to server", "type": "go", "request": "attach", "mode": "remote", // "remotePath": "${workspaceFolder}", // 注释掉这行 "port": 2345, "host": "remote_ip" } ] -
run这个配置,愉快调试~
备注
dlv命令
- 附加进程,启动调试服务:
dlv attach --listen=:2345 --headless=true --api-version=2 <pid> - 连接调试器:
dlv connect <ip>:<port> - dlv命令:
- 打断点:
b [file_name]:[line_num] - 继续运行:
c - 打印变量:
print [var_name]
- 打断点:
docker中attach失败的操作
更改yama:
sudo vim /etc/sysctl.d/10-ptrace.conf kernel.yama.ptrace_scope = 1 改成 kernel.yama.ptrace_scope = 0
sudo sysctl -p
检查:
cat /proc/sys/kernel/yama/ptrace_scope
# 应当回显0