利用dlv进行远程调试go-《GO开发知识笔记》

admin 2025-11-04 01:20:33 编程 来源:ZONE.CI 全球网 0 阅读模式
  • 前言
    • 事前准备
  • golang env config
  • golang proxy
  • golang env make sure change success
    • 操作示例
      • 1. 开发一个简单的demo web服务
        • 2.2 编译
      • 3. 部署
        • 3.1 配置SFTP
        • 3.3 部署到目标主机上的目标目录
      • 4. 调试
        • 4.1 登录目标主机,查看是否已经成功部署,并且赋予执行权限
        • 4.2 检查防火墙是否开启,如果开启,开放端口2345
        • 4.3 启动一下,看看服务本身有没有问题
        • 4.4 用dlv运行调试监听服务

    前言

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

    事前准备
    1. 部署主机:运行环境,靶机,可以是开发环境、测试环境、联调环境甚至生产环境
      • 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

    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.png3.1.2. Connection=>SSH Configuration配置目标主机 image.png3.1.3. Mappings=>Local Path配置本地编译输出路径,Deployment Path配置目标主机的部署路径

    image.png3.2 配置启动配置

    3.2.1. 选择Remoteimage.png3.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}/pingimage.png

    4.4 用dlv运行调试监听服务

    4.4.1. 运行服务

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

    image.png4.4.2. 开发Go LandF9运行调试image.png目标主机输出相应变化image.png4.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

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  10