GO语言远程DEBUG_mayongze321的博客

CSDN博客_go 远程调试 · · 159 次点击 · · 开始浏览    

在windows系统下开发Linux环境下的分布式系统组件时,往往因为组件之间的相互依赖调用需要进行服务端调试,delve是一款开源的go语言调试器,常用的go语言IDE,如goland vscode等都是依靠delve来进行调试操作的.

使用goland远程调试

使用goland来进行远程调试最好使用goland的 2019.1版本,原因是在goland 2019.1之前的版本中,因为调试路径映射的问题,必需保证本地和远程代码目录都在GOPATH下的src目录,且文件夹必需同名才可以正常进行远程的断点调试,否则在本地ide开启远程调试后就会显示 error "could not find "

delve的issues里详细的说明了这个问题:https://github.com/go-delve/delve/issues/1163

  1. 将本地代码拷贝到远程调试机上,可以通过goland插件Remote Hosts Access来完成,也可以手动上传或者git clone

  2. 在远程调试机器上安装调试工具delve安装方法 详见作者Github.

  3. 使用delve启动调试,这里有2中方式,一种是将代码手动编译成可执行程序调试,一种是直接使用dlv自动编译启动代码调试.

    • 手动编译方式调试(使用了module特性的推荐使用此方式)

      编译

      # Go 1.10以上版本
      go build -gcflags "all=-N -l" cmd/agent/main.go
      # 使用module离线打包
      go build -gcflags "all=-N -l" -o bin/agent -mod=vendor cmd/agent/main.go
      # Go 1.9及以前
      go build -gcflags "-N -l" cmd/agent/main.go
      

      运行

      dlv --listen=:2345 --headless=true --api-version=2 exec bin/agent
      
    • 直接debug自动编译运行

      dlv debug --headless --listen=:2345 --api-version=2 cmd/agent/main.go
      
  4. 在本地goland添加远程调试配置

    通过goland的菜单栏Run–>Edit Configurations来添加远程调试的配置
    在这里插入图片描述
    然后选择IDE右上角的远程调试选项,点击小虫子按钮开始远程调试就可以开心的在本地下断点远程调试服务端的程序啦!
    在这里插入图片描述

tips

  1. 可以使用docker来降低调试环境复杂度,将dlvgo sdk封装到docker里面,挂载代码工程目录到docker里GOPATH下的src目录里.

    拉取调试镜像

    docker pull robolwq/golang-debug:1.10.3
    

    挂载本地工程启动docker

    # /root/project 为工程目录
    
    # 启动用于调试的容器,并把目标代码目录挂载到容器内
    # 特别注意这个参数“--security-opt seccomp:unconfined”
    # 它的作用是禁用Linux内核层面的Secure computing mode
    # 目的是为了能够正确使用dlv相关命令
    # 具体可以参见:https://docs.docker.com/engine/security/seccomp/
    docker container run -ti --rm --security-opt seccomp:unconfined --net=host -v /root/project:/root/go/src/project robolwq/golang-debug:1.10.3  bash
    > cd $GOPATH/src/project
    > dlv debug --headless --listen=:2345 --api-version=2 cmd/agent/main.go
    
  2. 如果使用goland 2019.1以下的版本则需要配置本地目录和远程目录都在环境变量GOPATH中,且相对路径一致

    # windows 本地目录
    echo %GOPATH%
    D:\workspace\go
    
    # 远程服务器docker 里的环境
    echo $GOPATH
    /root/go
    
    # 工程代码必需名称一致且都在各自的GOPATH目录下的src目录里面才可以正常下断点调试
    cd /root/go/src/project
    dlv debug --headless --listen=:2345 --api-version=2 cmd/agent/main.go
    

参考链接

delve 项目仓库

goland 旧版本路径映射问题

关于路径映射问题的讨论

DIY 纯命令行调试

本文来自:CSDN博客_go 远程调试

感谢作者:CSDN博客_go 远程调试

查看原文:GO语言远程DEBUG_mayongze321的博客

159 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传