Go以及调试工具dlv安装及使用
Go以及调试工具dlv安装及使用
安装go
wget https://studygolang.com/dl/golang/go1.14.1.linux-amd64.tar.gz
tar -C /usr/local -zxvf go1.14.1.linux-amd64.tar.gz
mkdir -p /home/go/bin/home/go/pkg /home/go/src #官方建议工作目录为/home/go
vi .bash_profile
#在最下面添加
export GOROOT=/usr/local/go
export GOPATH=/home/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export GOPROXY="https://goproxy.io"
source .bash_profile
安装Delve
# cd $GOPATH/src/
# git clone https://github.com/derekparker/delve.git
# cd delve/cmd/dlv/
# go build
# go install
命令介绍
Delve时Go程序的源代码级的调试器。
Delve通过控制进程的执行、评估变量以及提供线程/ goroutine状态、CPU寄存器状态等信息,使你能够与程序进行交互。
使用“--”将标志传递给正在调试的程序,例如:
`dlv exec ./hello -- server --config conf/config.toml`
Usage:
dlv [command]
Available Commands:
attach 连接到正在运行的进程并开始调试.
connect 连接到无头调试服务器.
core 检查核心转储.
debug 编译并开始调试当前目录下的主包或指定的包.
exec 执行预编译的二进制文件,并开始调试会话.
help 帮助信息
run 弃用的命令。使用“debug”替代它.
test 编译测试二进制文件并开始调试程序.
trace 编译并开始跟踪程序.
version 打印版本.
Flags:
--accept-multiclient 允许无头服务器接受多个客户机连接。注意,服务器API不是可重入的,客户端必须协调.
--api-version int 无头时选择API版本. (default 1)
--backend string 后端选择:
default 在macOS上使用lldb,其他地方都是本地的.
native 本地后端.
lldb 使用lldb-server或debugserver.
rr 使用mozilla rr (https://github.com/mozilla/rr).
(default "default") 默认使用的是default
--build-flags string 生成标志,以传递给编译器.
--headless 仅在headless模式下运行调试服务器.
--init string 初始化文件,由终端客户端执行.
-l, --listen string 调试服务器监听地址. (default "localhost:0")
--log 启用调试服务器日志记录.
--log-output string 应该产生调试输出的组件的逗号分隔列表,可能的值为:
debugger 记录调试器命令
gdbwire 日志连接到gdbserial后端
lldbout 将输出从debugserver/lldb复制到标准输出
debuglineerr 读取.debug_line时日志可恢复错误
rpc 记录所有RPC消息
fncall 日志函数调用协议
minidump 日志minidump加载
使用--log启用日志时,默认为“debugger”.
--wd string 用于运行程序的工作目录. (default ".")
使用"dlv [command] --help"获取有关命令的详细信息.
debug和attach使用的多一点
dlv debug
dlv debug test.go -- arg1 arg2
-
b(break) main.main:设置断点,还可以根据行号设置断点 b 9
-
bp:查找已经设置的断点
-
c:该命令是让程序运行起来,遇到设置的断点会停止
-
restart:重新开始下一轮的调试
-
n:下一步,不会陷入内部
-
s:进入某个函数的内部,源码函数也跟踪进去
-
so:如果用s陷入到内部函数,可以快速使用该命令跳出来,回到进入点
-
p [var_name]:打印变量的值
-
gr and grs:这两个命令是用来查看goroutine的
-
help:使用过程中随时通过help查看命令
dlv attach
如果项目正在运行中,想要对正在运行的项目进行调试
1)首先使用"ps aux | grep 编译文件名"来查看运行程序的进程号pid
2)然后就能够使用"dlv attach pid"来连接该运行程序,然后就能使用之前debug中的命令来进行调试了
GoLand + Delve:远程调试
前面的例子有使用Delve启动应用或attach到应用进行调试,但添加断点,运行到下一步,查看变量值等操作都是在终端中,输入delve命令来进行的。这种调试方式也太古老了,效率低下。真实场景下,几乎不会使用这种方式来进行调试。我们还是希望借助IDE进行更高效的调试。 下面就介绍如何在GoLand中配合delve进行调试。包括附加到进程调试和远程调试。其实附加到本地进程和远程调试原理是一样的,待调试的进程是通过delve启动的,delve会启动进程,并立即附加到进程,开启一个debug session。并且启动一个debug server,暴露某个端口,客户端IDE可以通过该端口连接到debug server进行调试。
远程调试Debug优点
- 极大的加快开发速度,减少给在代码中使用大量log来定位错误(开发效率太低)
- 最大程度的使用linux远程服务器环境, 极大的简化本地部署模拟服务器环境
- 可以绕过数据库内网的限制
- 完美的解决一些不支持windows开发的依赖
步骤
- 在服务器上运行delve server,可以是用delve运行go代码,也可以是运行可执行程序,也可以是侵入一个运行中的go程序,一般来说attach一个运行中的go程序比较常见。
上述的三种方式:debug, exec, attach 都支持从远程操控,只需为 dlv 命令加上下述参数:
--listen=:2345 --headless=true --api-version=2 --accept-multiclient
dlv attach $PID --headless --api-version=2 --log --listen=:1234
这样delve server就起来了,然后 继续下一步就是Goland连接调试
- 直接在Goland中配置Host和Port即可
- 然后在本地设置完端点后,在源代码中选择这个“Go Remote”调试器进行调试