首页 > 其他分享 >golang调试利器 dlv 的使用

golang调试利器 dlv 的使用

时间:2024-03-28 16:23:08浏览次数:22  
标签:查看 golang 利器 dlv go main 断点 调试

安装

Github地址: https://github.com/go-delve/delve/

如果是在本地调试,直接通过go install命令将其安装到本地的$GOPATH/bin下即可

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

容器环境下由于不一定支持 go,需要先安装 go 语言环境,会比较麻烦,可以直接将本地下载好的dlv二进制命令复制到$PATH的某一个目录中。

安装好后,通过执行dlv version验证是否可用。

注意

使用go build编译时,默认会进行一些优化,会影响调试过程。

因此,对于对于需要进行调试的程序,在编译时最好设置-gcflags把优化关掉。

  • 在>= 1.10的 golang 版本中,设置-gcflags="all=-N -l"
  • 在<1.10版本的 golang 中,设置-gcflags="-N -l"

其中:

-N表示不优化代码,并生成调试信息。

-l表示禁用函数内联优化

如下面命令将当前文件夹下的代码编译成可执行文件main,并禁止优化:

go build -gcflags="all=-N -l" -o main .

常用命令

attach

用于调试一个已经存在的进程,这个命令一般在调试 web 程序时使用。如下:

  • 使用lsof命令查看占用某个端口的进程 pid
  • 使用dlv attach $pid启动调试该进程

比如假定某个 web 程序的 http端口为 8080,进程号为10001

lsof -i:8080
dlv attach 10001

exec

如果没有现成的进程,而只有一个二进制可执行文件,可以使用dlv exec命令启动一个进程并进行调试,如上面生成的main

dlv exec ./main

如果 main 程序本身需要一些参数,可以通过--来传递参数,比如给上面的 main 传入一个 conf 参数

dlv exec ./main -- conf=./conf.yaml

debug

用于直接调试源码文件,这个命令连手动编译都省了,只需要指定调试的包名和源码所在的文件夹即可。

dlv debug .

test

调试测试文件,用的不多

help

用于查看使用手册

version

用于查看dlv版本号,如下:

dlv version
# WARN[0000] CGO_CFLAGS already set, Cgo code could be optimized.  layer=dlv
# Delve Debugger
# Version: 1.21.0
# Build: $Id: fec0d226b2c2cce1567d5f59169660cf61dc1efe $

调试指令

通过execdebugattach进入 dlv 的调试终端后,需要执行调试指令才能完成诸如下一步、退出当前函数、查看变量值等目的。

断点管理

主要是断点的增删改查

指令缩写作用
break b 添加断点
breakpoints bp 用于查看设置的所有断点,每个断点都有一个编号
clear   如clear 1,表示删除编号为 1 的断点
clearall   删除所有断点
toggle   用于启用/禁用断点。如toggle 1
condition cond 用于设置条件断点,如cond 2 i == 10指定断点 2 在 i等于 10 时执行

需要注意的是,使用 break 创建断点时,有几种方法:

  • b 包名.方法名: 在指定包的函数中设置断点,如b main.main。如果函数名全局唯一,则不用指定包名
  • b 文件名:行数: 在指定的 go 文件的指定行设置断点,如b main.go:14

调试执行

主要用于控制程序的执行

指令缩写作用
next n 执行到下一行,如果是函数,不会进入函数
continue c 执行到下一个断点处或结束执行
step s 执行到下一步,如果是函数,会进入函数内部
stepout so 跳出当前函数
restart r 重新执行程序,断点会保留。注意无法用于 attach 的进程
step-instruction si 执行到下一行机器码,一般在查看汇编代码时使用
rebuild   重新编译程序并执行,断点会保留。无法用于 attach 和 exec

参数管理

主要用于对设置和查看变量、参数等

指令缩写作用
print p 查看变量或表达式的值
whatis   查看变量类型
args   查看函数的入参
locals   查看函数的局部变量
vars   查看全局变量
set   设置某个变量的值
display   将变量加入/移除监控列表、或查看监控列表

注意上述locals/vars/display都支持指定正则,具体用法可以使用h locals查看。

其他

指令缩写作用
exit q 退出调试会话
disassemble disass 用于查看指定函数的汇编代码
funcs   查看函数,同样支持正则
help h 查看使用手册
list ls/l 查看源代码

总结

本文介绍了dlv工具的基本使用姿势,掌握该工具,不仅能够辅助我们进行调试,以后想学习一些项目的原理时,也能够很快摸清楚调用链路。

后续我的其他分析原理性的文章中,也会使用使用这一工具对源代码进行分析。

原文: https://zhuanlan.zhihu.com/p/655096453

 

标签:查看,golang,利器,dlv,go,main,断点,调试
From: https://www.cnblogs.com/hanzeng1993/p/18101986

相关文章

  • Java 程序性能分析利器:IDEA Profiler,相见恨晚
    一个javawebapi,耗时2s,但是db300ms就返回了,时间到底耗费在哪里呢。当我最终定位下来,是因为db返回了5M数据跨局域网传输大概需要1s,导致的。一行行跟踪源码,很耽误时间。后来遇到了IDEAProfiler(IDEAIDE自带的性能分析工具),简直太好用了。https://www.jetbrains.com/pag......
  • 推荐 10 个非常有用的 Golang Libraries
    推荐10个非常有用的GolangLibraries原创 GoOfficialBlog GoOfficialBlog 2024-03-2518:16 山东 听全文Go语言的标准库非常好用。通常情况下,你不需要任何额外的库来完成任务。但是在某些情况下,可能需要使用一些库。今天将与你分享日常工作中很有用的10个......
  • NUC 13 Pro竞技场峡谷:性价比之王,打工人必选利器!
    想入手一台mini主机,却在钱包与性能之间难以取舍,真诚发问:究竟有没有这样一台mini主机,既能简单使用Adobe,又能着急处理PPT,闲暇还能回家打网游?新款NUC13Pro竞技场峡谷,可能适合这种“钱少事多”的需求。开箱即用,配件齐全包装右侧便是我们的“主菜”,NUC13Pro竞技场峡谷。这款......
  • 鼎信:北斗风偏弧垂监测装置|专治输电线路弧垂“利器”
    在电力系统中,导线弧垂的至始至终都扮演着一个至关重要角色,不仅是衡量线路健康运行的关键指标,更是确保输电稳定性和线下安全的重要因素。随着架空线路在日常运行中不断受到各种环境因素的影响,尤其是气象因素的变化,导线弧垂的监控成为了确保电力系统安全运行的核心任务。今天就......
  • 没想到三天10KStar的营销利器MediaCrawler开源作者已经删库了
    前言一站式社交平台数据抓取利器,带你玩转小红书、抖音、快手、B站和微博数据分析不经意间,来查看MediaCrawler仓库源码,发现作者已经删库了。看来是领奖了。才几天不到的时间Star数量已经直逼10K了,增长速度近乎疯狂。前两天只是将代码下载下来了,还没认真的玩。还好代码本地已经......
  • goland dlv 断点无效
    定位原因:1.打开HelpDebugLogSettings输入#com.goide.dlv.DlvVm2.collectlogandDiagnosticData我的解决办法:$gitclonehttps://github.com/go-delve/delve$cddelve$goinstallgithub.com/go-delve/delve/cmd/dlvhttps://github.com/go-delve/delve/tree/master......
  • golang模板库之fasttemplate
    简介fasttemplate是一个比较简单、易用的小型模板库。fasttemplate的作者valyala另外还开源了不少优秀的库,如大名鼎鼎的fasthttp,前面介绍的bytebufferpool,还有一个重量级的模板库quicktemplate。quicktemplate比标准库中的text/template和html/template要灵活和易用很多,后面会专......
  • Docker进阶:Docker Swarm(集群搭建) —实现容器编排的利器
    Docker进阶:DockerSwarm(集群搭建)—实现容器编排的利器1、什么是DockerSwarm?2、DockerSwarm与DockerCompose的区别3、创建一个Swarm集群(1-Manager,2-Worker)1、资源准备2、初始化Swarm集群Manager节点3、添加Worker节点到Swarm集群4、Manager节点查看集群状态4、......
  • Docker 容器编排利器 Docker Compose
    目录一、DockerCompose简介二、DockerCompose安装2.1Mac、Windows平台默认支持2.2Linux安装(通过包管理)2.2.1安装2.2.2测试2.2.3卸载2.3使用PIP安装与卸载2.3.1PIP安装2.3.2PIP卸载三、基本使用3.1术语3.2部署Flask应用四、Compose常用命令4.1命令对象与格......
  • golang gc的内部优化
    今天讲一个常见的gccompiler(也就是官方版本的go编译器和runtime)在垃圾回收的扫描标记阶段做的优化。我对这个优化的描述印象最深的是在bigcache的注释里,大致内容是如果map的键值都不包含指针,那么gc扫描的时候不管这个map多大都不会深入扫描map内部存储的数据,只检查map本身是否需......