Go以及调试工具dlv安装及使用
<h1 id="go以及调试工具dlv安装及使用">Go以及调试工具dlv安装及使用</h1><h2 id="安装go">安装go</h2>
<pre><code class="language-bash">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
</code></pre>
<h2 id="安装delve">安装Delve</h2>
<pre><code class="language-bash"># cd $GOPATH/src/
# git clone https://github.com/derekparker/delve.git
# cd delve/cmd/dlv/
# go build
# go install
</code></pre>
<h2 id="命令介绍">命令介绍</h2>
<p>Delve时Go程序的源代码级的调试器。</p>
<p>Delve通过控制进程的执行、评估变量以及提供线程/ goroutine状态、CPU寄存器状态等信息,使你能够与程序进行交互。</p>
<pre><code class="language-bash">使用“--”将标志传递给正在调试的程序,例如:
`dlv exec ./hello -- server --config conf/config.toml`
Usage:
dlv
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 --help"获取有关命令的详细信息.
</code></pre>
<p>debug和attach使用的多一点</p>
<h3 id="dlv-debug">dlv debug</h3>
<p><code>dlv debug test.go -- arg1 arg2</code></p>
<ul>
<li>
<p>b(break) main.main:设置断点,还可以根据行号设置断点 b 9</p>
</li>
<li>
<p>bp:查找已经设置的断点</p>
</li>
<li>
<p>c:该命令是让程序运行起来,遇到设置的断点会停止</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNly1gr1g2n221wj30zb0f2gnj.jpg" alt="截屏2021-05-31 上午11.23.03" loading="lazy"></p>
</li>
<li>
<p>restart:重新开始下一轮的调试</p>
</li>
<li>
<p>n:下一步,不会陷入内部</p>
</li>
<li>
<p>s:进入某个函数的内部,源码函数也跟踪进去</p>
</li>
<li>
<p>so:如果用s陷入到内部函数,可以快速使用该命令跳出来,回到进入点</p>
</li>
<li>
<p>p :打印变量的值</p>
</li>
<li>
<p>gr and grs:这两个命令是用来查看goroutine的</p>
</li>
<li>
<p>help:使用过程中随时通过help查看命令</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNly1gr1gkkktsvj613w0m60wb02.jpg" alt="截屏2021-05-31 上午11.40.25" loading="lazy"></p>
</li>
</ul>
<h3 id="dlv-attach">dlv attach</h3>
<p>如果项目正在运行中,想要对正在运行的项目进行调试</p>
<p>1)首先使用"ps aux | grep 编译文件名"来查看运行程序的进程号pid</p>
<p>2)然后就能够使用"dlv attach pid"来连接该运行程序,然后就能使用之前debug中的命令来进行调试了</p>
<h2 id="goland--delve远程调试">GoLand + Delve:远程调试</h2>
<p>前面的例子有使用Delve启动应用或attach到应用进行调试,但添加断点,运行到下一步,查看变量值等操作都是在终端中,输入delve命令来进行的。这种调试方式也太古老了,效率低下。真实场景下,几乎不会使用这种方式来进行调试。我们还是希望借助IDE进行更高效的调试。 下面就介绍如何在GoLand中配合delve进行调试。包括附加到进程调试和远程调试。其实附加到本地进程和远程调试原理是一样的,待调试的进程是通过delve启动的,delve会启动进程,并立即附加到进程,开启一个debug session。并且启动一个debug server,暴露某个端口,客户端IDE可以通过该端口连接到debug server进行调试。</p>
<h3 id="远程调试debug优点">远程调试Debug优点</h3>
<ol>
<li>极大的加快开发速度,减少给在代码中使用大量log来定位错误(开发效率太低)</li>
<li>最大程度的使用linux远程服务器环境, 极大的简化本地部署模拟服务器环境</li>
<li>可以绕过数据库内网的限制</li>
<li>完美的解决一些不支持windows开发的依赖</li>
</ol>
<h3 id="步骤">步骤</h3>
<ol>
<li>在服务器上运行delve server,可以是用delve运行go代码,也可以是运行可执行程序,也可以是侵入一个运行中的go程序,一般来说attach一个运行中的go程序比较常见。<br>
上述的三种方式:debug, exec, attach 都支持从远程操控,只需为 dlv 命令加上下述参数:</li>
</ol>
<p>--listen=:2345 --headless=true --api-version=2 --accept-multiclient</p>
<pre><code class="language-bash">dlv attach $PID --headless --api-version=2 --log --listen=:1234
</code></pre>
<p>这样delve server就起来了,然后 继续下一步就是Goland连接调试</p>
<ol start="2">
<li>直接在Goland中配置Host和Port即可</li>
</ol>
<p><img src="https://img2023.cnblogs.com/blog/2231162/202307/2231162-20230712200507088-2099384717.png" alt="" loading="lazy"></p>
<ol start="3">
<li>然后在本地设置完端点后,在源代码中选择这个“Go Remote”调试器进行调试</li>
</ol>
</div>
<div id="MySignature" role="contentinfo">
转载请注明出处:https://www.cnblogs.com/yrxing/<br><br>
来源:https://www.cnblogs.com/yrxing/p/14830827.html
頁:
[1]