go调试工具-delve

go调试工具-delve

简介

go debug工具,专门为go开发的调试工具,并且采用go语言开发,支持多平台。

官网:https://github.com/go-delve/delve

官网有详细的手册,学习起来很方便

在这里插入图片描述

快速开始

安装

我本地的go版本
在这里插入图片描述

官方手册

go install github.com/go-delve/delve/cmd/dlv@latest

测试代码

package main

import (
	"context"
	"errors"
	"fmt"
)

func main() {
	fmt.Println("begin")

	var (
		a = []int{1,2,3,4,5}
		b = []int{1,2,3,4,5}
		ctx = context.Background()
	)
	res, err := doOperation(ctx, a, b)
	if err != nil {
		return
	}
	fmt.Printf("%v\n",res)

	fmt.Println("end")

}
func doOperation(ctx context.Context,a,b []int) ([]int,error)  {
	if len(a) == 0 && len(b) == 0{
		return nil,errors.New("slice is empty")
	}
	if len(a) != len(b){
		return nil,errors.New("slice length not equals")
	}
	res := make([]int, len(a))
	for index := range a {
		res[index] = a[index] + b[index]
	}
	return res,nil
}

文件结构

在这里插入图片描述

dlv开始调试

进入项目的根目录下,执行

dlv debug

在这里插入图片描述

输入help看帮助信息

断点

在main.go的第十行打个断点

输入 b或者break

在这里插入图片描述

继续运行直到下一个断点

输入 c或者continue

在这里插入图片描述

逐步运行

输入n或者next

进入到调用函数(step in)

输入sstep

现在在doOperation打个断点,先运行到这里

b main.go:17

在输入c

在这里插入图片描述

s进入,结果如下
在这里插入图片描述

查看当前执行的代码

list

在这里插入图片描述

退出当前函数(step out)

输入so或者step out

现在运行到了doOperation,想要返回到main 调用它的地方,输入so

打印变量

p或者print

在这里插入图片描述

查看所有的本地变量

locals

在这里插入图片描述

重新debug

修改代码之后重新的debug

rebuild,会保留之前打的断点

使用介绍

上面的快速开始介绍了一些常用的使用方式,它的help写的很好,很清晰,关于单个命令就不再这里介绍了。

下面主要介绍几个命令

  1. debug
  2. exec
  3. test

除此之外还有一个子命令(开始dlv session之后的输入的命令)

disassemble-官方文档

debug

官方文档

dlv debug [package] [flags]

在没有参数的情况下,会自动编译当前文件夹下面的main包,也可以指定包的名字来debug

此外,还支持远程debug。

–headless :会开启一个服务端,用connect命令来连接及可进行debug,只要命令里面支持这个flag就可以用。

例子如下

  1. 启动服务端

    –headless:启动服务端

    -l:指定端口

    –log:开启日志

dlv debug --headless -l :2345 --log

在这里插入图片描述

  1. 客户端连接
dlv connect localhost:2345

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ubRoJCwK-1685874754047)(C:\Users\liuchen\AppData\Roaming\Typora\typora-user-images\image-20230604164443208.png)]

连接好之后就可以正常操作了。

exec

官方文档

对编译好的二进制进行debug

建议在build 二进制文件的时候要关闭掉编译器的优化,build的增加下面参数

-gcflags="all=-N -l"

同样的,它也支持服务器的方式,远程调试。

test

用来做单元测试的debug

官方文档

例子如下:

现在对上面的doOperation做单元测试,测试代码如下

package main

import (
	"context"
	"reflect"
	"testing"
)

func Test_doOperation(t *testing.T) {
	var ctx  = context.Background()
	t.Run("test1", func(t *testing.T) {
		type args struct {
			ctx context.Context
			a   []int
			b   []int
		}
		tests := []struct {
			name    string
			args    args
			want    []int
			wantErr bool
		}{
			{
				name:    "test1",
				args:    args{
					ctx: ctx,
					a:   []int{1,2,3,4},
					b:   []int{1,2,3,4},
				},
				want:    []int{2,4,6,8},
				wantErr: false,
			},
		}

		for _, tt := range tests {
			t.Run(tt.name, func(t *testing.T) {
				got, err := doOperation(tt.args.ctx, tt.args.a, tt.args.b)
				if (err != nil) != tt.wantErr {
					t.Errorf("doOperation() error = %v, wantErr %v", err, tt.wantErr)
					return
				}
				if !reflect.DeepEqual(got, tt.want) {
					t.Errorf("doOperation() got = %v, want %v", got, tt.want)
				}
			})
		}
	})
	t.Run("test2", func(t *testing.T) {
		type args struct {
			ctx context.Context
			a   []int
			b   []int
		}
		tests := []struct {
			name    string
			args    args
			want    []int
			wantErr bool
		}{
			{
				name:    "test1",
				args:    args{
					ctx: ctx,
					a:   []int{1,2,3,4},
					b:   []int{1,2,3,4},
				},
				want:    []int{2,4,6,8},
				wantErr: false,
			},
		}

		for _, tt := range tests {
			t.Run(tt.name, func(t *testing.T) {
				got, err := doOperation(tt.args.ctx, tt.args.a, tt.args.b)
				if (err != nil) != tt.wantErr {
					t.Errorf("doOperation() error = %v, wantErr %v", err, tt.wantErr)
					return
				}
				if !reflect.DeepEqual(got, tt.want) {
					t.Errorf("doOperation() got = %v, want %v", got, tt.want)
				}
			})
		}
	})
}

如上所示,一个方法里面有两个子测试。

dlv test [package] [flags]
  1. 运行当前package下所有的单测

    dlv test -- --test.v
    

在这里插入图片描述

  1. 选择的运行

    dlv test -- --test.run Test_doOperation --test.v
    // 如果想要运行Test_doOperation中的test1,需要用/来拼接
    dlv test -- --test.run Test_doOperation/test1 --test.v
    

    可以正常的做操作,比如打断点
    在这里插入图片描述

查看它支持的test相关的flag

随便输入一个错误的flag,会输出所有的flag

 dlv test -- --test.cd

在这里插入图片描述

goLand 远程debug

这就是把上面说的远程debug和goLand结合了起来。先说出核心操作是

  1. 服务端开启用dlv 启动debug,headlress模式,go在build源码的时候需要禁用优化。
  2. 客户端连接,正常debug

先用命令行操作,在结合goLand使用

命令行操作

go build

go build -o debug_main  -gcflags "all=-N -l" base_go

dlv启动服务端

dlv exec ./debug_main --listen=:9987 --headless --api-version=2 --accept-multiclient --log
// 命令解释
// listen 指定host和port
// headless 启动无头浏览器
// api-version
// accept-multiclient

dlv启动客户端

 dlv connect hadoop105:9987

在这里插入图片描述

正常操作

现在的背景是:服务端在Linux服务器中,客户端在windows中。

打断点

在这里插入图片描述

list查看代码

在这里插入图片描述

因为两个执行路径不一样,所以,打不开文件。但别的功能是可以用的,

在这里插入图片描述

goLang操作

在这里插入图片描述

搜索Go Remote,添加Host和Port,其实这里以及告诉我们服务端要怎么做了。

启动服务端

在这里插入图片描述

先在config里面选择刚才的remote,打断点,debug运行(先打断点,在启动debug)

到这里就结束了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/26600.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QGIS 对 GeoJson 文件数据进行压缩

项目场景 地图开发,友商提供的是边界Shapefile文件,文件比较大,例如某个文件就 29.2 M ,这么大的数据,在echarts 上显示地图,前端会很卡,特别是有地图下钻的时候,体验很不好&#x…

Window winget 包管理工具安装踩坑记录

一、简介 想在 window 上安装一个好用的包管理工具,mac 上用 homebrew, window 则考虑再三,使用官方提供的 winget。 winget 官方使用文档。 二、安装流程与踩坑记录 按 win x,选择 Powershell(管理员) 方式打开 c…

mysql数据类型有哪几种

Mysql支持的多种数据类型主要有:数值数据类型、日期/时间类型、字符串类型。 整数 浮点数&定点数 注:定点数以字符串形式存储,对精度要求高时使用decimal较好;尽量避免对浮点数进行减法和比较运算。 时间/日期类型 字符串类型…

网格搜索:Python遍历网格中每个点

遍历网格中每个点 1. 问题描述2. Python实现2.1 网格参数初始化2.2 遍历赋值2.3 矩阵赋值1. 问题描述 最近需要实现一个对矩阵赋值并对矩阵表示的网格参数进行测试的任务,假设网格的长宽均为k,待搜索的两个参数是Pitch 和 Yaw,存在两个列表中。现在需要将网格上不同参数设置…

Redis实战14-分布式锁基本原理和不同实现方式对比

在上一篇文章中,我们知道了,当在集群环境下,synchronized关键字实现的JVM级别锁会失效的。那么怎么解决这个问题呢?我们可以使用分布式锁来解决。本文咱们就来介绍分布式锁基本原理以及不同实现方式对比。 我们先来回顾&#xff…

IMX6ULL裸机篇之I2C实验-硬件原理图

一. I2C 实验简介 I2C实验,我们就来学习如何使用 I.MX6U 的 I2C 接口来驱动 AP3216C,读取 AP3216C 的传感器数据。 AP3216C是一个三合一的环境光传感器,ALSPSIRLED,ALS是环境光,PS是接近传感器,IR是红外L…

若依之权限处理

若依之权限处理 若依前后端不分离版本使用的是shiro进行权限控制,本文主要是对shiro在若依中的使用进行分析。 RBAC权限模型 RBAC是指基于角色的访问控制。其基本思想是,对系统的各种权限不是直接授予具体的用户,而是在用户集合与权限集合…

通过python采集关键字搜索1688工厂数据接口,1688工厂数据接口,1688API接口

1688是一个行业网站,主要提供中小型批发和生产商的信息,是中国供应商向全球采购商展示其产品的平台。在1688上,可以找到许多工厂和制造商的信息,包括公司名称、地址、联系人、联系方式、主要产品等。 采集1688工厂数据可以帮助采…

PDCCH monitoring capability

欢迎关注同名微信公众号“modem协议笔记”。 前段时间看search space set group (SSSG) switching相关内容时,注意到R17和R16的描述由于PDCCH monitoring capability的变化,内容有些不一样。于是就顺带看了下R16 R17PDCCH monitoring capability的内容。…

实战:单点登录的两种实现方式,附源码

最近工作有点忙,好久没更新文章了,正好这两天在整理单点登陆相关的文档,今天趁着小孩睡着了🤫,赶紧码一篇实战文交差。 概念 单点登录(Single Sign-On,SSO)是一种身份验证服务&…

【Mysql】InnoDB 中 B+ 树索引的注意事项

一、根页面万年不动 在之前的文章里,为了方便理解,都是先画存储用户记录的叶子节点,然后再画出存储目录项记录的内节点。 但实际上 B 树的行成过程是这样的: 每当为某个表创建一个 B 树索引,都会为这个索引创建一个根…

单例模式C++实现和观察者模式C++实现

目录 1、单例模式介绍 2、单例代码实现 2.1 static介绍 2.2 C中static的三种用法: (1)静态局部变量 (2)静态成员变量 (3)静态成员函数 3、观察者模式介绍 4、观察者代码实现 1、单例模…

2023年十大最佳自动化测试工具(建议收藏)

Best Automation Testing Tools for 2023 对更快交付高质量软件(或"快速质量")的需求要求组织以敏捷,持续集成(CI)和DevOps方法论来寻找解决方案。测试自动化是这些方面的重要组成部分。最新的《 2018-2019…

使用koa2搭建后端服务器

目录 第一步 第二步 第三步 第四步 第五步 流程说明 1.配置连接数据库 2.添加Schema模型 3.配置路由接口 第一步 npm i -g koa-generator 第二步 koa2 server 第三步 cd server && npm install 第四步 将服务器拖进编译器运行 npm run dev 在浏览器输入…

迅为RK3568开发板2800页手册+220集视频

iTOP-3568开发板采用瑞芯微RK3568处理器,内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz,RK809动态调频。集成了双核心架构GPU,ARM G52 2EE、支持OpenGLES1.1/2.0/3.2OpenCL2.0、Vulkan 1.1、内高性能2D加速硬件。 内置NPU 内置独立NP…

SpringBoot生成RESTful API文档

由于我一开始学习的SpringBoot是3以上版本,所以我这里用到的也是支持和SpringBoot3能够整合的SpringDoc 这里先说一下,其实SpringDoc就是Swagger3版本,我一开始整合的2版本,比较麻烦况且最后SpringBoot程序都启动不了了&#xff0…

信息竞赛笔记(2)––快速幂

目录 快速幂 定义 分析 代码 递归实现 非递归实现(通用方法) 模意义下取幂 快速幂 定义 快速幂,二进制取幂(Binary Exponentiation,也称平方法),是一个在的时间内计算的小技巧,而暴力的计算需要的时间。 这个技巧也常常用在非计算的场景,因为它可…

yolov5部署到android studio

目录 环境获取demo将pt文件导出为ptl文件修改demo修改PrePostProcessor增加ptl文件并增加类别文件修改MainActivity 大功告成 环境 Ubuntu22.10 Pytorch2.0.1cu117 Android Studio Flamingo | 2022.2.1 Patch 1 获取demo git clone https://github.com/pytorch/android-demo…

day43|动态规划6-完全背包及其应用-零钱兑换II-组合总和IV

完全背包 前情提要: 0-1背包指的是给定背包重量,将物品放入背包中,使得背包中的物品达到最大的价值。(每个物品只能往其中放一次) 在0-1背包问题中,第二层for循环需要是倒序遍历才可以保证每个物品只使用一…

重估端到端原则

评价技术迭代的旧的定势眼光来自于该技术诞生时。 1970/80/90 年代,相比传输带宽技术,处理器更强。网络协议倾向于字段多,字段小且紧凑,尽可能减少传输量,用 “算法技巧” 等价,如果 TCP 序列号 48 位&…