docker环境下go dlv远程调试环境搭建 & 使用 & vscode附加进程调试

570 阅读1分钟

构建镜像

通过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连接

  1. 项目根目录配置launch.json

    • port host正常配,注意注释掉remotePath这一项
    "configurations": [
        {
            "name": "Connect to server",
            "type": "go",
            "request": "attach",
            "mode": "remote",
            // "remotePath": "${workspaceFolder}", // 注释掉这行
            "port": 2345,
            "host": "remote_ip"
        }
    ]
    
  2. 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