go dlv

Created

2024-10-28 13:33:31

Updated

2024-10-28 13:33:33

1 安装

go install github.com/go-delve/delve/cmd/dlv@latest
# 安装的路径在, 需要export
go env GOPATH

2 常用命令

dlv attach pid #对正在运行的进程直接进行调试
dlv debug main.go
dlv exec 可执行文件
help # 查看帮助
# b  打断点 包名.方法名
b main.main
c
# 在上面的c 执行后,才可以这样b 到行号
b 11 # 直接行号 打断点
# 或者 一开始这样直接打 行号的断点
b main.go:12
bp # 打印所有断点
p a # 打印变量a
# 打印 某个内存地址的内容,比如想看 sp寄存器指向的内存
p *(*uint64)(0x000000c000050758)
s # 逐行执行代码 遇到函数会进入内部
si # step-instruction  逐个 cpu指令的 执行
so # stepout 跳出函数
n # 逐行执行代码 不进入函数内
args #查看被调用函数所传入的参数值
locals #查看所有局部变量
locals 变量名 # 查看具体变量
clear 编号 # 删除指定断点 ,bp 打印可以看到编号
clearall #  删除所有断点
regs # 打印寄存器信息
grs # goroutines  显示所有协程,有编号 , *表示当前执行的协程
gr # goroutine 编号  切换协程
l # 打印代码

r # restart 重启当前进程
# 查看汇编代码
disassemble -l main.main

3 调试 _test.go 文件

func TestBasic(t *testing.T) {
    a := struct{}{}
    b := struct{}{}
    fmt.Println(unsafe.Sizeof(a)) //0
    // 相同
    fmt.Printf("%p,%p\n", &a, &b)
    fmt.Println(11)
}
# Double-dashes `--` can be used to pass arguments to the test program
# dlv test [package] -- -test.run TestSomething -test.v -other-argument
dlv test -- -test.run TestBasic -test.v
# b 打断点 后面的是 Test 的方法名
(dlv) b TestBasic
(dlv) c  # 执行到断点位置
(dlv) n # 下一行
(dlv) n # 下一行
(dlv) p &a
Back to top