1. Delve 介绍
Delve(通常简写为dlv)是一个为Go语言设计的调试器,它提供了深入代码内部的洞察力和控制力,帮助开发者更好地理解代码的行为,高效地定位和修复问题。
使用 dlv 进行调试,需要关闭编译器的内联、优化,不可用于生成环境:
Go 1.10及以后,编译时需指定-gcflags="all=-N -l"
Go 1.10之前,编译时需指定-gcflags="-N -l"
参考:https://github.com/go-delve/delve/issues/3338
dlv官方版本仅支持64位程序调试,非官方版本可支持32位 但仅限于Go 1.15以下的版本程序调试
参考:https://github.com/puppywang/delve/blob/master/CHANGELOG.md
2. dlv 基础使用流程
步骤1:go程序构建,构建参数:
set GOARCH=arm64
go build -gcflags="all=-N -l" -o mygo ./cmd/mybox/main.go
步骤2:拷贝dlv工具包、64位二进制Go程序包到Linux系统,并赋予可执行权限
步骤3:后台运行64位二进制go程序 :nohup ./mygo > /root/app/log/mygo.log 2>&1 &
步骤4:top 查看mygo进程 [pid]
步骤5: top -d 1 -p [pid] -H 查找cup高的可疑线程 [tid]
步骤6:对于已编译好的二进制文件,使用 dlv attach 附加到线程/进程开启调试: ./dlv attach [tid/pid]
步骤7: dlv中输入: grs 打印所有协程信息。 分析协程信息,获取异常协程号:[goroutine id]
步骤8: dlv中输入: gr [goroutine id] 在dlv中切换到对应协程
步骤9: dlv中输入: bt 分析堆栈信息查找对应代码,分析问题
3. 调试指令说明
threads:
./dlv attach [pid]后输入: threads 可查看该进程所有线程信息
输入 thread [tid] 可切换至该线程,然后可输入grs查看该线程所有协程信息
break 简写 b 设置断点
输入:b [xxx.go]: [行数] 可在对应go文件对应行数设置断点
breakpoints 简写 bp 查看所有断点
clear [断点Id] 删除指定断点 clearall 删除所有断点
continue 简写 c 运行到下个断点
next 简写 n 单步执行
args 查看传入函数的参数
locals 查看局部变量
print 查看变量值/值类型
stack 简写bt 查看栈帧信息
q 退出 dlv
4. 使用技巧:
4.1 如何通过分析协程信息,获取异常协程
理解协程状态
chan receive:协程正在等待从一个channel接收数据。
select:协程正在等待多个channel操作中的某一个完成。
GC ... wait:协程与垃圾收集相关,通常不会消耗大量CPU时间。
debug call:协程与调试器相关,通常不表示性能问题。
如果协程长时间停留在chan receive或select状态,并且没有看到相应的数据发送到该channel,那么该协程可能被卡住了, 检查与该channel相关的代码逻辑。
4.2 如何设置断点,查看方法入参、局部变量
获取到异常协程号后 输入 gr [协程号],进入该协程调试
输入bt 查看该协程堆栈信息
输入b xx.go:[行号] 在该行代码设置断点
输入c 运行到该断点
输入 args 查看函数入参
输入 locals 查看函数局部变量
输入 print [局部变量] 查看变量值
5. 参考文档:
1、 go-delve/delve: Delve is a debugger for the Go programming language. (github.com)
2、 别再用GDB了,一文掌握Go最好用的调试器Delve-腾讯云开发者社区-腾讯云 (tencent.com)
3、 使用 Delve 工具调试 Golang 程序-腾讯云开发者社区-腾讯云 (tencent.com)
4、 go 调试器 delve(dlv) 的使用(附实例及常用命令解释)_dlv attach-CSDN博客
6. 附件
https://files.cnblogs.com/files/axibug/dlv.7z?t=1718366928&download=true 标签:协程,查看,调试,dlv,go,断点,输入 From: https://www.cnblogs.com/axibug/p/18248570