本地调试是首选,如果可以本地调试,那自然是本地调试最方便。
但是本地环境和实际环境很多时候是不一样的,很难在本机搭建出与线上完全相同的环境,比如我们想调试数据库、调试rpc、调试服务注册发现,这些线上都是现成的,但在我们本机就很难复制,再比如线上的网络和我们本机的网络环境是不一样的,这些场景下本地调试均无法满足我们的需求,需要把我们的程序部署在线上环境,才能测试。
之前不知道远程调试,我都是改好了程序,push到git上,然后到线上的机器pull下来,编译,运行,看日志。。。一方面,每次改完程序想测试一下,很繁琐,另一方面,完整的开发完一个feature,产生了几十次commit。。。
好在,goland有远程调试功能!
有了远程调试,在goland写完代码,直接同步到远端机器,然后点小虫子按钮调试,然后设断点,就基本上跟本地调试一样方便了。
Golang debug 推荐使用 Delve 工具,项目地址:https://github.com/derekparke...
1.安装
# git clone https://github.com/derekparker/delve.git
# cd delve/cmd/dlv/
# go build
# go install
或者
go get -u github.com/go-delve/delve/cmd/dlv
安装成功之后,运行 dlv 如下图:
cp ./dlv /usr/local/bin/
2.调试
调试就一句语句: dlv debug main.go
# cd helloword/
# go mod init
# dlv debug main.go
dlv常用的命令:
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 ---------------------- 打印表达式的类型.
远程调试几个步骤:
远程服务器安装 delv (上面已经介绍)
远程服务器编译要调试的程序:
go build -gcflags "all=-N -l" test1.go
远程服务器运行命令:
dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./test1
本地goland配置连接:
本地代码就可以设置断点就可以调试了。
参考:
https://djqueue.blog.csdn.net...
https://blog.csdn.net/zhetmdo...
https://www.jianshu.com/p/4b2...
https://www.jianshu.com/p/280...