实际工作中难免遇到需要调试服务器上代码的情况,最近项目就遇到了代码在服务上报出tcp握手失败的异常,而本地却正常的情况,日志不好加,这里研究了一下golang的远程调试方法,并做记录。
测试基于goland和dlv实现go代码的远程调试。远程服务器采用centos7.9
安装配置
下载golang linux安装包,并解压到/root/apps/go 目录,配置环境变量
vi /etc/profile
export GOROOT=/root/apps/go
export GOPATH=/root/apps/go/gopath
export PATH=$PATH:/$GOROOT/bin:$GOPATH/bin
验证
执行 如下命令查看go的版本,能看到证明安装成功
[root@localhost go]# go version
go version go1.17.5 linux/amd64
dvl 工具安装
下载工具dlv
[root@localhost gopath]# go env -w GOPROXY=https://goproxy.cn --配置golang代理
[root@localhost gopath]# cd $GOPATH -- 到 gopath目录下
[root@localhost gopath]# go install github.com/go-delve/delve/cmd/dlv@latest --安装dlv
[root@localhost gopath]# ln -s $GOPATH/bin/dlv /usr/local/bin/dlv --配置软连接
[root@localhost gopath]# dlv version
Delve Debugger
Version: 1.8.0
Build: $Id: 6a6c9c332d5354ddf1f8a2da3cc477bd18d2be53 $
也可以直接下载我编译好的,放到服务器上并赋予执行权限即可。点击下载
开发部署示例程序代码
采用goland 开发示例程序如下,我们这里循环打印当前时间10000次以观察调试效果,myTest.go代码如下
package main
import (
"fmt"
"time"
)
var (
age int
name string
)
func main(){
age = 18
name = "surpass"
fmt.Println("name is %s, age is %d",name,age)
for i := 0; i < 10000; i++ {
time.Sleep(1*time.Second)
fmt.Println("time======",time.Now())
}
}
编译及部署
将代码编译并部署到 上述centos 服务器上,如下 gotest,为gotest增加执行权限
采用如下命令运行程序可以看到进程id,具体如下
[root@localhost gopath]# ll
总用量 2124
drwxr-xr-x. 2 root root 17 12月 26 12:03 bin
-rwx------. 1 root root 2040565 12月 26 12:21 gotest
-rw-------. 1 root root 86568 12月 26 12:59 nohup.out
drwxr-xr-x. 4 root root 30 12月 26 12:03 pkg
drwxr-xr-x. 3 root root 24 12月 26 00:32 src
[root@localhost gopath]# nohup ./gotest &
[2] 335
[root@localhost gopath]# nohup: 忽略输入并把输出追加到"nohup.out"
进行调试验证
启动dlv
centos 服务器上启动gotest程序后,需要通过如下命令启用dlv工具,可以看大启动后 dlv在等待客户端连接
[root@localhost gopath]# dlv attach 335 --headless --listen=:2345 --api-version=2 --accept-multiclient
API server listening at: [::]:2345
2021-12-26T13:06:55+08:00 warning layer=rpc Listening for remote connections (connections are not authenticated nor encrypted)
goland配置
goland中增加一个go remote 配置如下
goland调试代码
打好断点,然后debug 新建的 mytestRemote,即可进行调试如下
同时可以看到,只有调试才会有日志输出
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)