使用delve调试golang

简介: 使用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

这样编译即可: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该程序即可,需要确保两端的代码是一致的。

参考

目录
相关文章
|
11月前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
396 2
|
Kubernetes 网络协议 Java
使用kind创建K8s集群
第一次在centos上安装踩了几个坑
2078 0
|
3月前
|
存储 JSON Prometheus
产品图片上传API接口
产品图片上传API是电商、内容管理系统等常用功能,支持通过HTTP请求上传图片至服务器,便于产品图像管理。本文详解其工作原理、实现步骤与最佳实践,助您快速构建高效上传功能。
240 0
|
6月前
|
存储 资源调度 Cloud Native
VMware vCenter Server 8.0U3e 新增功能简介
VMware vCenter Server 8.0U3e 新增功能简介
226 4
VMware vCenter Server 8.0U3e 新增功能简介
|
11月前
|
运维 Kubernetes Cloud Native
云原生时代下的应用部署与管理
【10月更文挑战第38天】在数字化浪潮中,云原生技术正引领着软件开发和运维的革命。本文将探讨云原生的核心概念、优势以及如何通过代码示例实现应用的快速部署和管理,旨在为读者提供一套清晰的云原生应用部署和管理的实践指南。
|
Go iOS开发 MacOS
Go学习笔记-代码调试工具 dlv
Go学习笔记-代码调试工具 dlv
1743 1
Go学习笔记-代码调试工具 dlv
|
负载均衡 网络协议 算法
|
存储 监控 安全
安全规范问题之跟数据库交互涉及的敏感数据操作需要有哪些措施
安全规范问题之跟数据库交互涉及的敏感数据操作需要有哪些措施