Golang 开发调试工具 Delve
hello,大家好,我是张张,「架构精进之路」公号作者。
一、为什么需要Debug?
-
不侵入程序,直接调试代码
-
更直观得观察程序运行过程
-
方便定位一些疑难问题,例如死循环、僵尸进程等
-
有助于阅读Go的底层代码
二、Go 的Debug
在Go语言的学习过程中,我们常用调试PHP的方法对某个变量进行print或者log输出,虽然这样的操作可以解决大部分的程序问题。但是,如果面对goroutine这样的调试输出,又该如何进行呢?
Go 语言目前的调试器有如下几种:
-
GDB 最早期的调试工具,现在用的很少。
-
LLDB macOS 系统推荐的标准调试工具,单 Go 的一些专有特性支持的比较少。
-
Delve 专门为 Go 语言打造的调试工具,使用最为广泛。
Delve 是 Go 程序的源代码级的调试器,那调试工具dlv在开发工作中非常实用,怎么装、怎么用?
本文带你快速上手dlv调试工具来调试 Go 程序,Let's go!
三、安装与配置
1、下载安装
-
go get github.com/derekparker/delve/cmd/dlv
-
dlv的具体安装方法参考:github.com/go-delve/de…
根据自身机器应用环境,按照文档安装即可。
2、常用命令
The following commands are available:
args ------------------------ 打印函数参数.
break (alias: b) ------------ 设置断点.
breakpoints (alias: bp) ----- 输出活动断点的信息.
call ------------------------ 恢复进程,注入一个函数调用(还在实验阶段!!)
clear ----------------------- 删除断点.
clearall -------------------- 删除多个断点.
condition (alias: cond) ----- 设置断点条件.
config ---------------------- 修改配置参数.
continue (alias: c) --------- 运行到断点或程序终止.
deferred -------------------- 在延迟调用的上下文中执行命令.
disassemble (alias: disass) - 反汇编程序.
down ------------------------ 将当前帧向下移动.
edit (alias: ed) ------------ 在$DELVE_EDITOR或$EDITOR中打开你所在的位置
exit (alias: quit | q) ------ 退出调试器.
frame ----------------------- 设置当前帧,或在不同的帧上执行命令.
funcs ----------------------- 打印函数列表.
goroutine ------------------- 显示或更改当前goroutine
goroutines ------------------ 列举程序goroutines.
help (alias: h) ------------- 打印帮助信息.
list (alias: ls | l) -------- 显示源代码.
locals ---------------------- 打印局部变量.
next (alias: n) ------------- 转到下一个源行.
on -------------------------- 在命中断点时执行命令.
print (alias: p) ------------ 计算一个表达式.
regs ------------------------ 打印CPU寄存器的内容.
restart (alias: r) ---------- 重启进程.
set ------------------------- 更改变量的值.
source ---------------------- 执行包含delve命令列表的文件
sources --------------------- 打印源文件列表.
stack (alias: bt) ----------- 打印堆栈跟踪信息.
step (alias: s) ------------- 单步执行程序.
step-instruction (alias: si) 单步执行一条cpu指令.
stepout --------------------- 跳出当前函数.
thread (alias: tr) ---------- 切换到指定的线程.
threads --------------------- 打印每个跟踪线程的信息.
trace (alias: t) ------------ 设置跟踪点.
types ----------------------- 打印类型列表
up -------------------------- 向上移动当前帧.
vars ------------------------ 打印包变量.
whatis ---------------------- 打印表达式的类型.
在命令前键入help来获得命令的完整文档,如help goroutine
3、编辑器debug
使用 GoLand
进行调试也很简单,都是图形化界面,加断点即直接点击行号,开始调试,点击右上角的小甲壳虫即可。
IDE 中的操作流程如下:
-
左键加断点
-
以debug模式启动进程
-
效果图
四、应用示例
演示示例:
#1、debug一个main.go程序
dlv debug json.go
#2、在main包里的main函数入口打断点
break(b)main.main
#3、继续运行,直到断点处停止
continue(c)
#4、单步运行
next(n)
#5、打印local variables
locals
#6、打印一个变量或者表达式
print(p)
#7、Restart Process
restart(r)
----------------------------------------
bp 断点
bt 堆栈
grs 协程s
gr 当前协程
gr 协程id 切换协程
r 重启进程
以上是常用的调试命令,还有一些command,可以执行dlv help查看具体用法!
·END·
希望今天的讲解对大家有所帮助,谢谢!
Thanks for reading!
作者:架构精进之路,十年研发风雨路,大厂架构师,CSDN 博客专家,专注架构技术沉淀学习及分享,职业与认知升级,坚持分享接地气儿的干货文章,期待与你一起成长。 关注并私信我回复“01”,送你一份程序员成长进阶大礼包,欢迎勾搭。
转载自:https://juejin.cn/post/7371306814309056549