Golang中 delve实战分析一个常驻进程挂起的问题

简介:

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/[email protected]+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/[email protected]+incompatible/redis/pool.go:278
 5  0x00000000008345b7 in github.com/gomodule/redigo/redis.(*Pool).Get
    at /home/www/go/pkg/mod/github.com/gomodule/[email protected]+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/[email protected]+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	打印某个包内的(全局)变量

 

你可能感兴趣的:(GoLang)