使用delve調試golang

charlieroro 2022-01-07 20:52:19 阅读数:442

使用 delve golang

前置要求

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

使用方式

使用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: ""},}

更多參見官方文檔

版权声明:本文为[charlieroro]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201072052191836.html