简介:
Delve目的就是为了解决开发者在使用 GDB 调试中遇到的各种各样的问题
1. 首先安装
获取前,请确保 GOPATH 已经设置。Go 1.8 版本之后,GOPATH 默认在用户目录的 go 文件夹
go get -u github.com/go-delve/delve/cmd/dlv
参考:https://github.com/go-delve/delve/blob/master/Documentation/installation/linux/install.md
2.找到出问题的常驻进程 duration的pid,然后attach
[www@test3 gogin]$ pidof duration
18824
[www@test3 gogin]$ dlv attach 18824
Type 'help' for list of commands.
(dlv)
3.通过goroutines命令查看程序中的goroutine
(dlv) goroutine
Thread 18824 at /usr/local/go/src/runtime/sys_linux_amd64.s:536
Goroutine 1:
Runtime: /usr/local/go/src/runtime/proc.go:305 runtime.gopark (0x431150)
User: /home/www/go/pkg/mod/github.com/gomodule/redigo@v2.0.0+incompatible/redis/pool.go:278 github.com/gomodule/redigo/redis.(*Pool).get (0x835585)
Go: /usr/local/go/src/runtime/asm_amd64.s:220 runtime.rt0_go (0x45a3a4)
Start: /usr/local/go/src/runtime/proc.go:113 runtime.main (0x430b60)
(dlv) goroutine 1
Switched from 0 to 1 (thread 18824)
(dlv) bt
0 0x0000000000431150 in runtime.gopark
at /usr/local/go/src/runtime/proc.go:305
1 0x0000000000407828 in runtime.goparkunlock
at /usr/local/go/src/runtime/proc.go:310
2 0x0000000000407828 in runtime.chanrecv
at /usr/local/go/src/runtime/chan.go:524
3 0x00000000004074eb in runtime.chanrecv1
at /usr/local/go/src/runtime/chan.go:406
4 0x0000000000835585 in github.com/gomodule/redigo/redis.(*Pool).get
at /home/www/go/pkg/mod/github.com/gomodule/redigo@v2.0.0+incompatible/redis/pool.go:278
5 0x00000000008345b7 in github.com/gomodule/redigo/redis.(*Pool).Get
at /home/www/go/pkg/mod/github.com/gomodule/redigo@v2.0.0+incompatible/redis/pool.go:179
6 0x0000000000a17f0f in gogin/console/alisls/lib.(*Rds).GetWorkReading
at ./console/alisls/lib/redis.go:82
7 0x0000000000a1874d in gogin/console/alisls/lib.SaveDurationToAdb
at ./console/alisls/lib/redis.go:115
8 0x0000000000a1aa02 in main.main
at ./console/alisls/duration.go:6
9 0x0000000000430d7e in runtime.main
at /usr/local/go/src/runtime/proc.go:203
10 0x000000000045c571 in runtime.goexit
at /usr/local/go/src/runtime/asm_amd64.s:1357
从输出可以看到main的函数调用链为
main.main => lib.SaveDurationToAdb => lib.(*Rds).GetWorkReading => redis.(*Pool).Get
从调用链跟踪代码过去到 /home/www/go/pkg/mod/github.com/gomodule/redigo@v2.0.0+incompatible/redis/pool.go:278
<-p.ch
发现是连接池等待获取链接,推断是连接池满了,没有释放,去代码释放即可
命令行界面
命令
命令 描述
args 打印函数参数
break 设置一个断点
breakpoints 打印激活的断点信息
clear 删除断点
clearall 删除所有的断点
condition 设置断点条件
continue 运行到断点或程序终止
disassemble 拆解器
exit 退出debugger
frame 在不同的框架上执行的命令
funcs 打印函数列表
goroutine 显示或更改当前goroutine
goroutines 列出程序的全部goroutines
help 打印出帮助信息
list 显示源代码
locals 打印局部变量
next 跳到下一行
on 在遇到断点时执行一个命令
print 评估表达式
regs 打印CPU寄存器的内容
restart 重启进程
set 更改变量的值
source 执行包含delve命令列表的文件
sources 打印源文件列表
stack 打印堆栈跟踪
step 单步执行程序
step-instruction 单步单个执行cpu指令
thread 切换到指定的线程
threads 打印每一个跟踪线程的信息
trace 设置跟踪点
types 打印类型列表
vars 打印某个包内的(全局)变量