前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Golang的Debug工具delve介绍

Golang的Debug工具delve介绍

作者头像
大愚
发布于 2020-05-20 08:34:45
发布于 2020-05-20 08:34:45
1.5K00
代码可运行
举报
文章被收录于专栏:大愚Talk大愚Talk
运行总次数:0
代码可运行

delve 的汉语意思是:钻研、探索;用这个来命名一个debug工具还是非常的形象。

本文主要介绍该工具的安装与常用使用方法。是一个step-by-step的文章。目标是帮助大家学会如何使用 delve 来debug自己的代码。

安装

官网的安装文档地址:https://github.com/go-delve/delve/tree/master/Documentation/installation

我再重复下如何在 Mac 上进行安装。

首先 xcode-select --install 把依赖的编译工具链安装一下。

然后通过下面的命令即可完成

$ go get github.com/go-delve/delve/cmd/dlv

这里有个注意点,大家如果使用modules的方式来管理项目,应该知道安装依赖包也是上面这个命令。所以执行上面的命令时,请确保自己不是在一个go modules的路径下。

到此,安装工作就可以完成了,可以在终端执行,可以看到如下画面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/Users/dayu >dlv version
Delve Debugger
Version: 1.4.0
Build: $Id: 67422e6f7148fa1efa0eac1423ab5594b223d93b $

命令介绍

用中文来翻译下命令的含义。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Usage:
  dlv [command]

Available Commands:
  attach      可以用来对一个正在运行的进行进行调试.
  connect     连接到headless调试器.
  core        用来调试core文件.
  dap         [EXPERIMENTAL] 启动一个Debug Adaptor Protocol (DAP)TCP服务器来通信.
  debug       在当前包或者指定的包编译并debug程序.
  exec        如果你已经编译好了二进制,可以用该命令启动调试.
  help        帮助命令.
  test        可以用来测试自己编写的测试源码文件.
  trace       编译并跟踪程序.

dlv 的命令非常多,主要介绍下 debugattach 的使用。其它命令大家可以尝试下,不过一般用的也非常少!dlv test 这个也非常有用,不过使用跟debug差不多。

使用

下面将主要介绍这 debugattach 如何使用,这两个命令其实主要面对两种使用场景。

  1. 用 Golang 写了一个命令行程序,想要debug一下;
  2. 写了一个 Grpc 或者 Http 服务,运行的进行进行debug;

进入调试后,他们的命令非常相似,下面开始我们的 debug 之旅。

Debug Main包程序

先来看直接使用 debug 来调试代码。调试的代码样例:

debug调试代码

此时在终端进入该文件所在路径,然后执行

dlv debug

然后会成功进入 delve 提供的debug交互界面,如下图所示。

debug交互

图中展示了三个非常常用的命令。来分别解释下。

  • b main.main

这个命令的全拼是:break main.main 用来设置断点的。除了这种写法,常用的还有使用行号来设置断点 b 9

  • bp

这个命令是用来查找已经设置的断点的。

断点查看

查看已经设置的断点常常一个目的是用来寻找 clear 可以清除哪一个断点。

  • c

该命令是让程序运行起来。遇到设置的断点会停止。

上面只是非常基础的三个命令,我们再来继续往下走。继续看这张执行示例图

调试

这张图中的命令,都是非常常用的调试命令,来一起看看作用

  • restart

这个命令的主要作用就是一轮debug完成了,重新开始下一轮,上一次设置的断点会依然有效

  • n

这是执行下一步,也就是代码的下一行。它就是一行一行的往下,不会陷入内部去

  • s

该命令注意与 n 的区别,它是进入某个函数的内部,源码函数也能够跟踪进去,非常有利于我们学习。但是对于 goroutine 执行的函数你是无法进入的。这也很好理解,因为它的执行时机不可知。

  • p

这个是debug过程中非常重要的一个命令,打印变量的值。也是学习 go 语言的一个利器,图中可以看到一个 channel 初始化之后的内部结构体。这对我们理解源码非常有帮助。

下面的命令图中没有演示,但觉得有必要说一下。

  • so

如果用了 s 陷入到内部函数,可以快速使用该命令跳出来,回到进入点。

  • gr and grs

这两个命令是用来查看 groutine 的。

他还有非常多的命令。我们可以在使用过程中随时使用 help 来进行查看。文末我也放了一张所有命令图的翻译。

Debug运行的进程

对于运行中的进程,主要说明下如何进入 debug 交互界面,进入后的操作与上面是一样的。

假如我们有一个 http 的进程在运行,看一下如何进行 debug。示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
	http.HandleFunc("/", Hello)

	http.ListenAndServe(":8080", nil)
}

func Hello(w http.ResponseWriter, r *http.Request) {
	a := "test"

	fmt.Println(a)

	time.Sleep(3 * time.Second)

	fmt.Fprint(w, "Hello World")
}

将这个 demo 给运行起来,然后找到他的进程号。执行下面的命令:

dlv attach {pid}

这个 pid 就是当前进程的进程号。

使用该方式要注意:设置完断点后记得用 c 让进程处于运行状态,否则对于 http 或者 grpc 的程序,没有办法继续接受请求,进而无法进入测试。

参考资料

[1] https://github.com/go-delve/delve

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大愚Talk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
盘点golang中的开发神器
在Java中,我们用Junit做单元测试,用JMH做性能基准测试(benchmark),用async-profiler剖析cpu性能,用jstack、jmap、arthas等来排查问题。
龟仙老人
2020/12/15
1.9K0
通过dlv简单分析Go coredump文件
编译构建go程序 禁止优化 go build -gcflags "-N -l" ... 查看详细的编译过程命令 go build -x ... 补充:go build 编译选项:
美团骑手
2022/08/07
2.5K0
Golang程序调试常用方法
一般来说,项目开发过程中,代码编写占开发总时间的40%,剩下的时间基本就是自测和联调的过程。程序出错很正常,关键是如何迅速的去定位它,修掉它。本文将介绍自己程序调试的一些常用方法,这边我以golang为例,总结为望问切闻---debug四部曲。
于顾而言SASE
2024/03/21
2400
Golang程序调试常用方法
Go每日一库之174:delve (Go 调试工具)
Delve 用来调试 Go 语言开发的程序,该工具的目标是为 Go 语言提供一个简单、功能齐全的调试工具。
luckpunk
2023/09/30
9840
Go每日一库之174:delve (Go 调试工具)
go debug工具-dlv
golang debug 工具 dlv 可以非常方便 go 程序做单步调试。 安装 dlv工具安装: $ git clone https://github.com/go-delve/delve $ cd delve $ go install github.com/go-delve/delve/cmd/dlv 使用 三种用法, 直接在代码目录下运行main文件: $ dlv debug 直接 attach 已经运行的目标程序 $ dlv attach <PID> 运行二进制程序: $ dlv exec <目
机械视角
2022/06/28
1.1K0
Go 语言源码级调试器 Delve
Delve 是一个简单、强大和易用的 Go 语言源代码层级的调试器,也是 Go 官方推荐使用的调试器。
frank.
2022/07/01
2.1K0
golang调试工具Delve
Devle是一个非常棒的golang 调试工具,支持多种调试方式,直接运行调试,或者attach到一个正在运行中的golang程序,进行调试。
lpxxn
2018/03/07
2.2K0
golang调试工具Delve
使用 Delve 工具调试 Golang 程序
Delve 是一个 go 语言的第三方调试器,github 地址是: https://github.com/go-delve/delve 。Delve 是 GDB 调试器的有效替代品。与 GDB 相比,它能更高的理解 Go 的运行时,数据结构以及表达式。Delve 目前支持 Linux,OSX 以及 Windows 的 amd64 平台。
Go学堂
2023/01/31
1.6K0
Debug线上服务
对于已上线的 Go 服务,进行调试通常需要在代码中添加调试信息或者利用已有的日志系统。由于直接使用调试器可能会影响服务的性能或者稳定性,因此需要采用一些谨慎的方法。
孟斯特
2024/01/03
3160
Debug线上服务
Go语言开发调试中阶
几年前,为学习某个开发框架,需要在系统层装一大堆的类库和脚手架(看到nodejs开发者默默点头了),搞得系统越来越臃肿。。。上帝说要有光,于是以docker为代表的容器技术诞生了,通过DIY构建镜像,能够将所有的依赖打包到一起,并且可以到处运行,一切似乎都变得简单了。。。
nevermosby
2020/05/11
1.1K0
Golang程序调试工具介绍(gdb vs dlv)
通过log库输出日志,我们可以对程序进行异常分析和问题追踪。但有时候,我也希望能有更直接的程序跟踪及定位工具能够帮助我们更方便快捷的追踪、定位问题,最直观的感觉还是使用调试器。Linux平台下,原生的C/C++程序,我们往往使用gdb进行程序调试,切换到Golang,我们同样还是可以使用gdb进行调试。同时我们还可以使用golang实现的调试器dlv进行调试。以下内容是我对gdb以及dlv使用及对比总结
sunsky
2020/08/20
4.9K0
使用Visual Studio Code和delve进行golang远程调试
在本地和远程服务器上,创建一个简单的Go程序作为我们的示例代码。文件名为main.go,定义一个变量i和doSomething方法的参数n足够我们观察变量:
运维开发王义杰
2023/08/15
3.6K0
使用Visual Studio Code和delve进行golang远程调试
使用delve调试golang
dlv调试要求可执行文件不能删掉调试信息,即-ldflags参数中不能包含 -w -s标志。可以使用如下方式查看可执行文件是否有删除调试信息,"not stripped"表示没有删除调试信息
charlieroro
2022/05/09
4960
使用delve调试golang
Go远程调试方案
本文将对远程调试这个日常开发问题,进行一些方法上的梳理,涉及语言包括golang、python。
liliane
2024/08/30
2650
别再用GDB了,一文掌握Go最好用的调试器Delve
Delve 是 Go 中使用最多的调试器,本文基于 Delve 对 Go 的调试进行了介绍。如果你对基于日志的调试感到无奈,不妨看一下本文。读完全文还可以参加文末龙年红包封面抽奖活动哦!
腾讯云开发者
2024/01/11
3K0
别再用GDB了,一文掌握Go最好用的调试器Delve
【Vscode】调试go语言程序的最佳实践
Delve是Go语言调试工具。vscode调试,实质是集成了Delve。vscode可以一键安装所有go开发的相关工具,本篇不赘述。
DDGarfield
2022/06/23
11.6K1
【Vscode】调试go语言程序的最佳实践
Go开发使用VSCode完全配置指南
近期和朋友合作完成一个项目,后端使用 Golang 来进行编写。那么我又把 Golang 重新捣鼓起来了,然后看了一下文件记录,都一年多没有写了。
林小帅
2020/02/25
8.4K0
Go开发使用VSCode完全配置指南
go语言程序调试
调试程序是程序猿的一项必备技能,有多种手段来调试程序,如打印控制台输出,查看日志,以及设置断点,使用debug做单步跟踪进去调试。这篇文章主要从go使用debug为题进行展开。
暮雨
2019/08/07
7920
如何编译调试Go runtime源码
有朋友问我阅读源码,该怎么调试?这次我们简单看看如何编译调试 Go 的 runtime 源码,感兴趣的朋友可以自己手动操作一下。
luozhiyun
2021/03/31
8630
《Go语言入门经典》16~18章读书笔记
Go语言提供了log包,让应用程序能够将日志写入终端或文件。下面是一个简单的程序,它向终端输出一条日志消息。
跑马溜溜的球
2020/12/07
5730
相关推荐
盘点golang中的开发神器
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验