用delve调试golang

delve是golang推荐的调试工具,大名鼎鼎的GoLand, 使用的也是delve。使用gdb也可以调试delve,不过据我所知,对golang而言,gdb还是有些bug存在,优先推荐使用delve

环境准备

需要在对应机器上安装dlv和golang环境

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

查看版本

dlv version

帮助文档

调试代码

  1. 启动调试

方式一,先进入main函数所在目录,直接执行dlv debug

cd xxx/cmd/

dlv debug  --arg1 value --arg2 value
#其中用--来传递参数

方式二,在任意目录下,执行dlv debug pakcage

dlv debug github.com/me/foo/cmd/foo
  1. 帮助命令
help
  1. 设置断点

设置断点的方式:

设置到指定函数
b main.main

设置到指定代码行数(可设置到引用库中)
b /fullpathtofile/xxx@v0.31.0-dev0-fix0/xxx.go:457
  1. 运行程序:
c

调试测试用例

假设测试用例代码结构如下:

├── pkg
│   └── baz
│       ├── bar.go
│       └── bar_test.go

调试流程:

$ dlv test github.com/me/foo/pkg/baz
Type 'help' for list of commands.
(dlv) funcs test.Test*
/home/me/go/src/github.com/me/foo/pkg/baz/test.TestHi
(dlv) break TestHi
Breakpoint 1 set at 0x536513 for /home/me/go/src/github.com/me/foo/pkg/baz/test.TestHi() ./test_test.go:5
(dlv) continue
> /home/me/go/src/github.com/me/foo/pkg/baz/test.TestHi() ./bar_test.go:5 (hits goroutine(5):1 total:1) (PC: 0x536513)
     1:    package baz
     2:    
     3:    import "testing"
     4:    
=>   5:    func TestHi(t *testing.T) {
     6:        t.Fatal("implement me!")
     7:    }
(dlv) 
  • dlv test开始测试用例调试
  • funcs用正则表达式查找函数
  • break设置断点
  • countinue开始调试

常用指令

代码相关:

l
显示代码

l 70
显示第70行代码

断点相关:

n
下一行

s
step into

so
step out

c
continue

bp
打印所有断点

clear 3
删除id为3的断点

clearall
删除所有断点

查询查看

p xxx
查看变量xxx的值

bt
查看调用栈

args
查看函数变量

locals
查看所有临时变量

help
查看帮助

goroutine

gr
查看当前goroutine

gr 3
切换到id为3的goroutine

grs
查看所有的goroutines


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About Me

一位程序员,会弹吉他,喜欢读诗。
有一颗感恩的心,一位美丽的妻子,两个可爱的女儿
mail: geraldlee0825@gmail.com
github: https://github.com/lisuxiaoqi
medium: https://medium.com/@geraldlee0825