go 语言调试工具:dlv 简单使用

 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 [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.     附件

  dlv 

  dlv使用文档

 

 

https://files.cnblogs.com/files/axibug/dlv.7z?t=1718366928&download=true
posted @ 2024-06-14 20:14  java从精通到入门  阅读(12)  评论(0编辑  收藏  举报