前言

远程调试go源码,用于可能由于环境不同造成不可知影响下的调试。简而言之,就是本地没问题,目标环境莫名其妙问题的调试,一般都能得到解决。

事前准备
  1. 部署主机:运行环境,靶机,可以是开发环境、测试环境、联调环境甚至生产环境

vim /etc/profile

golang env config

export GO111MODULE=on export GOROOT=/usr/local/go export GOPATH=/home/gopath # user-defined export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

source /etc/profile

golang proxy

go env -w GOPROXY=https://goproxy.cn,direct

golang env make sure change success

go env

  1. - 安装dlv
  2. ```java
  3. go get github.com/go-delve/delve/cmd/dlv
  1. 开发主机:本地开发主机,其实就是你的开发机
    • Windows 10
    • Go language 1.16
    • Go Land 2021.2+

      操作示例

      1. 开发一个简单的demo web服务
      ```java package main

import( “github.com/gin-gonic/gin” “log” ) func main(){ r := gin.Default() r.GET(“/ping”, func(c *gin.Context) { Step() c.JSON(200, gin.H{ “message”: “pong”, }) }) r.Run(“:8080”) }

func Step(){ log.Println(“step01”) log.Println(“step02”) log.Println(“step03”) log.Println(“step04”) log.Println(“step05”) }

  1. <a name="Oq7uN"></a>
  2. ##### 2. 编译
  3. <a name="Yysj0"></a>
  4. ###### 2.1 创建一个Makefile文件
  5. ```java
  6. build:
  7. go mod tidy
  8. CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -gcflags="all=-N -l" -o ./bin/demo -v

2.2 编译

windows下安装make,建议采用chocolate来安装,其他安装方式都有各种坑

  1. choco install make
  1. make

编译生成二进制文件demo,如图所示:

image.png
如遇到需要特定编译环境,如程序中使用了cgo,无法交叉编译,那么可以选择把代码传输到对应平台的编译机进行编译,或者在目标机器上进行编译,之后运行。

3. 部署

3.1 配置SFTP

3.1.1. 选择Deployment
image.png
3.1.2. Connection=>SSH Configuration配置目标主机
image.png
3.1.3. Mappings=>Local Path配置本地编译输出路径,Deployment Path配置目标主机的部署路径

image.png
3.2 配置启动配置

3.2.1. 选择Remote
image.png
3.2.2. 填写目标主机IP、dlv运行的端口(一般2345),同时可以参考Go Land提供一些方案配置

3.3 部署到目标主机上的目标目录

image.png

4. 调试

4.1 登录目标主机,查看是否已经成功部署,并且赋予执行权限
  1. chmod +x demo

image.png

4.2 检查防火墙是否开启,如果开启,开放端口2345
  1. # 查看防火墙状态
  2. systemctl status firewalld.service
  3. firewall-cmd --list-port
  4. # 添加开放端口,并持久化
  5. firewall-cmd --zone=public --add-port=2345/tcp --permanent
  6. firewall-cmd --zone=public --add-port=8080/tcp --permanent
  7. firewall-cmd --list-port
  8. # 重启防火墙
  9. firewall-cmd --reload
  10. firewall-cmd --list-port

4.3 启动一下,看看服务本身有没有问题
  1. ./demo

image.png
浏览器里请求一下接口

http://{host}/ping
image.png

4.4 用dlv运行调试监听服务

4.4.1. 运行服务

  1. dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./demo

image.png
4.4.2. 开发Go LandF9运行调试
image.png
目标主机输出相应变化
image.png
4.4.3. 打个断点
image.png
浏览器访问一下接口,http://{host}/ping

image.png

4.5 用dlv调试已经运行的服务

4.5.1. 用后台运行服务

  1. ./demo&

4.5.2. 查看服务当前进程号

  1. netstat -nap | grep 8080

image.png
得到PID=21369

4.5.3. 运行dlv进行调试

  1. dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient attach 21369

image.png