Go 进阶 · 分布式爬虫实战
郑建勋
Go 语言技术专家,《Go 语言底层原理剖析》作者
15839 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
Go 进阶 · 分布式爬虫实战
15
15
1.0x
00:00/00:00
登录|注册

38|高级调试:怎样利用Delve调试复杂的程序问题?

你好,我是郑建勋。
工欲善其事,必先利其器。这节课,我们来看看怎么合理地使用调试器让开发事半功倍。调试器能够控制应用程序的执行,它可以让程序在特定的位置暂停并观察当前的状态,还能够控制单步执行代码和指令,以便观察程序的执行分支。
当我们谈到调试器,一些有经验的开发可能会想到 GDB,不过在 Go 语言中,我们一般会选择使用 Delve(dlv)。这不仅因为 Delve 比 GDB 更了解 Go 运行时、数据结构和表达式,还因为 Go 中栈扩容等特性会让GDB 得到错误的结果。所以这节课,我们就主要来看看如何利用 Delve 完成 Go 程序的调试。

Delve 的内部架构

我们先来看看Delve的内部架构。Delve 本身也是用 Go 语言实现的,它的内部可以分为 3 层。
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
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • 陈卧虫
    如果在远程容器中开发,如何用goland 连接远程容器中的dlv呢

    作者回复: 首先是把容器的端口映射到宿主机上,其次调整一下docker启动时候的安全参数

    2023-01-06归属地:浙江
    3
    1
  • 大毛
    不建议将 Delve 用在线上环境中,因为断点会阻塞程序的运行,如果你的断点打在了核心位置上,这个断点会阻塞线上环境中所有协程的运行。 最近正在思考当爬虫被阻塞后要如何定位问题,使用 dlv attach 似乎是一个不错的选择
    2024-02-15归属地:新疆
  • 一打七
    Goland远程调试时,dlv attach怎么用?这才是更多的场景
    2024-01-12归属地:北京
    1
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部