目录
- 使用
funcs
查找支持的函数 - 使用break(b)打断点
- 使用
breakpoints
查看当前活动的断点。 - 使用
clear
清除断点 - 使用
goroutines
查看所有协程 - 使用
stack(bt)
查看goroutine
的栈信息 - 使用
attach
连接到正在运行的进程
前置要求
dlv调试要求可执行文件不能删掉调试信息,即-ldflags
参数中不能包含 -w -s
标志。可以使用如下方式查看可执行文件是否有删除调试信息,"not stripped"表示没有删除调试信息
# file alert-sd-engine alert-sd-engine: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
这样编译即可:
go build -gcflags "all=-N -l" -o ./app
使用方式
使用funcs
查找支持的函数
使用funcs
可以打印可以查看调试的函数。可以在后面加上函数的名字或部分名字可以检索出支持的函数,如:
(dlv) funcs VmSvc devops/alert-sd-engine/pkg.(*Monitor).createVmSvcScrape devops/alert-sd-engine/pkg.(*Monitor).deleteVmSvcScrape devops/alert-sd-engine/pkg.(*Monitor).getVmSvcScrape devops/alert-sd-engine/pkg.(*Monitor).isVmSvcScrapeExist devops/alert-sd-engine/pkg.(*Monitor).updateVmSvcScrape devops/alert-sd-engine/pkg.createVmSvcScrape devops/alert-sd-engine/pkg.deleteVmSvcScrape devops/alert-sd-engine/pkg.getVmSvcScrape devops/alert-sd-engine/pkg.updateVmSvcScrape
使用break(b)打断点
根据funcs
找到的函数,使用break
在需要的函数上打断点
(dlv) break devops/alert-sd-engine/pkg.(*Monitor).getVmSvcScrape
当然也可以使用如下方式将断点打到文件的某一行
(dlv) b engine.go:196
使用breakpoints
查看当前活动的断点。
(dlv) breakpoints Breakpoint runtime-fatal-throw (enabled) at 0x4345e0 for runtime.throw() /usr/local/go/src/runtime/panic.go:1188 (0) Breakpoint unrecovered-panic (enabled) at 0x434940 for runtime.fatalpanic() /usr/local/go/src/runtime/panic.go:1271 (0) print runtime.curg._panic.arg Breakpoint 2 (enabled) at 0x1399452 for devops/alert-sd-engine/pkg.(*Monitor).getVmSvcScrape() .alert-sd-engine/pkg/engine.go:195 (0) Breakpoint 4 (enabled) at 0x1399479 for devops/alert-sd-engine/pkg.(*Monitor).getVmSvcScrape() ./alert-sd-engine/pkg/engine.go:196 (0)
使用clear
清除断点
使用clear
清除某个断电
使用clearall
可以清除所有断点
使用goroutines
查看所有协程
(dlv) goroutines Goroutine 1 - User: /usr/local/go/src/net/fd_unix.go:173 net.(*netFD).accept (0x5f4f55) [IO wait] Goroutine 2 - User: /usr/local/go/src/runtime/proc.go:367 runtime.gopark (0x4370f6) [force gc (idle) 455958h37m56.413188346s] Goroutine 3 - User: /usr/local/go/src/runtime/proc.go:367 runtime.gopark (0x4370f6) [GC sweep wait] Goroutine 4 - User: /usr/local/go/src/runtime/proc.go:367 runtime.gopark (0x4370f6) [GC scavenge wait]
使用goroutine
可以切换goroutine
使用stack(bt)
查看goroutine
的栈信息
(dlv) goroutine 1 stack 0 0x00000000004370f6 in runtime.gopark at /usr/local/go/src/runtime/proc.go:367 1 0x000000000042f7fe in runtime.netpollblock at /usr/local/go/src/runtime/netpoll.go:445 2 0x000000000045efa9 in internal/poll.runtime_pollWait at /usr/local/go/src/runtime/netpoll.go:229
使用frame
可以设置当前栈位置,使用up
可以向上移动栈,使用down
可以向下移动栈
使用attach
连接到正在运行的进程
使用attach
可以连接到正在运行的进程
使用locals
打印当前的局部遍历,使用-v
可以打印更详细的信息
(dlv) locals -v req req = devops/alert-sd-engine/pkg.Req { Base: devops/alert-sd-engine/pkg.commData { Env: 0, ClusterName: "", DualActive: false, Namespace: "", Name: "", Endpoints: []devops/alert-sd-engine/pkg.Endpoint len: 0, cap: 0, nil,}, Selector: struct { Appid string "json:\"appId,omitempty\"" } {Appid: ""},}
更多参见官方文档
Tips
设置打印的字符串长度:
(dlv) config -list aliases map[] substitute-path [] max-string-len <not defined> max-array-values <not defined> show-location-expr false (dlv) config max-string-len 1000
goland远程调试
点击 Run — Edit configurations,点击+
,添加Go Remote
远端执行:dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./demo.exe
在golang的代码中打上断点,并启动debug该程序即可,需要确保两端的代码是一致的。