前言
远程调试go源码,用于可能由于环境不同造成不可知影响下的调试。简而言之,就是本地没问题,目标环境莫名其妙问题的调试,一般都能得到解决。
事前准备
- 部署主机:运行环境,靶机,可以是开发环境、测试环境、联调环境甚至生产环境
- Cent OS 7.5+
- Go language 1.16 ( 与开发机版本保持一致) ```java wget https://golang.google.cn/dl/go1.16.2.linux-amd64.tar.gz tar -zxvf go1.16.2.linux-amd64.tar.gz -C /usr/local
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
- 安装dlv
```java
go get github.com/go-delve/delve/cmd/dlv
- 开发主机:本地开发主机,其实就是你的开发机
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”) }
<a name="Oq7uN"></a>
##### 2. 编译
<a name="Yysj0"></a>
###### 2.1 创建一个Makefile文件
```java
build:
go mod tidy
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -gcflags="all=-N -l" -o ./bin/demo -v
2.2 编译
windows下安装make,建议采用chocolate来安装,其他安装方式都有各种坑
choco install make
make
编译生成二进制文件demo,如图所示:
如遇到需要特定编译环境,如程序中使用了cgo,无法交叉编译,那么可以选择把代码传输到对应平台的编译机进行编译,或者在目标机器上进行编译,之后运行。
3. 部署
3.1 配置SFTP
3.1.1. 选择Deployment
3.1.2. Connection=>SSH Configuration配置目标主机
3.1.3. Mappings=>Local Path配置本地编译输出路径,Deployment Path配置目标主机的部署路径
3.2 配置启动配置
3.2.1. 选择Remote
3.2.2. 填写目标主机IP、dlv运行的端口(一般2345),同时可以参考Go Land提供一些方案配置
3.3 部署到目标主机上的目标目录
4. 调试
4.1 登录目标主机,查看是否已经成功部署,并且赋予执行权限
chmod +x demo
4.2 检查防火墙是否开启,如果开启,开放端口2345
# 查看防火墙状态
systemctl status firewalld.service
firewall-cmd --list-port
# 添加开放端口,并持久化
firewall-cmd --zone=public --add-port=2345/tcp --permanent
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --list-port
# 重启防火墙
firewall-cmd --reload
firewall-cmd --list-port
4.3 启动一下,看看服务本身有没有问题
./demo
浏览器里请求一下接口
4.4 用dlv运行调试监听服务
4.4.1. 运行服务
dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./demo
4.4.2. 开发Go LandF9运行调试
目标主机输出相应变化
4.4.3. 打个断点
浏览器访问一下接口,http://{host}/ping
4.5 用dlv调试已经运行的服务
4.5.1. 用后台运行服务
./demo&
4.5.2. 查看服务当前进程号
netstat -nap | grep 8080
得到PID=21369
4.5.3. 运行dlv进行调试
dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient attach 21369