38|高级调试:怎样利用Delve调试复杂的程序问题?
郑建勋
你好,我是郑建勋。
工欲善其事,必先利其器。这节课,我们来看看怎么合理地使用调试器让开发事半功倍。调试器能够控制应用程序的执行,它可以让程序在特定的位置暂停并观察当前的状态,还能够控制单步执行代码和指令,以便观察程序的执行分支。
当我们谈到调试器,一些有经验的开发可能会想到 GDB,不过在 Go 语言中,我们一般会选择使用 Delve(dlv)。这不仅因为 Delve 比 GDB 更了解 Go 运行时、数据结构和表达式,还因为 Go 中栈扩容等特性会让GDB 得到错误的结果。所以这节课,我们就主要来看看如何利用 Delve 完成 Go 程序的调试。
Delve 的内部架构
UI Layer
UI layer 为用户交互层,用于接收用户的输入,解析用户输入的指令。例如打印变量信息时用户需要在交互层输入 print a。
Symbolic Layer
Symbolic Layer 用于解析用户的输入。例如对于 print a 这个打印指令,变量 a 可能是结构体、int 等多种类型,Symbolic Layer 负责将变量 a 转化为实际的内存地址和它对应的字节大小,最后通过 Target Layer 层读取内存数据。同时,Symbolic Layer 也会把从 Target Layer 中读取到的数据解析为对应的结构、行号等信息。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Delve是一个专门用于调试Go程序的调试器,相比于GDB,Delve更了解Go运行时、数据结构和表达式,因此在Go语言中更为常用。本文详细介绍了如何利用Delve调试复杂的程序问题,包括控制程序的执行、暂停和观察状态,以及单步执行代码和指令来观察程序的执行分支。文章还介绍了Delve的安装和常见指令的使用,包括设置断点、继续运行程序、单步执行、跳进函数、打印变量值、查看堆栈信息等。另外,文章还提到了Delve在在线上环境中的应用,例如在服务无响应时排查问题。通过实际案例展示了如何使用dlv attach指令进行调试,以及如何查找程序的进程号并进行调试。此外,文章还介绍了如何使用Goland进行调试,以及如何利用Goland和Delve配合进行远程调试。总的来说,本文内容丰富,适合想要深入了解Delve调试器的开发者阅读。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(3)
- 最新
- 精选
- 陈卧虫如果在远程容器中开发,如何用goland 连接远程容器中的dlv呢
作者回复: 首先是把容器的端口映射到宿主机上,其次调整一下docker启动时候的安全参数
2023-01-06归属地:浙江31 - 大毛不建议将 Delve 用在线上环境中,因为断点会阻塞程序的运行,如果你的断点打在了核心位置上,这个断点会阻塞线上环境中所有协程的运行。 最近正在思考当爬虫被阻塞后要如何定位问题,使用 dlv attach 似乎是一个不错的选择2024-02-15归属地:新疆
- 一打七Goland远程调试时,dlv attach怎么用?这才是更多的场景2024-01-12归属地:北京1
收起评论