31

go调试利器-delve

 3 years ago
source link: https://studygolang.com/articles/29576
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大家好,我是小栈君,好久没更新文章了,确实抱歉!因为工作变动等原因导致最近拖更严重,但是请大家放心,我会一如既往的为大家带来自己的原创文章,供大家相互交流和学习,一起成长。今天小栈君带来的分享是go语言的调试利器DELVE。

关于delve工具的介绍,这里简单给大家介绍一下。delve在go项目及应用的开发中可以用来追踪程序中的异常代码,也可以通过打日志的方式追查问题,但是更重要也是非常厉害的一点,就是delve可以直接分析程序执行的情况。这一点在后期或线上的问题排查中无疑是提供了一个非常大的便捷。

我们可以登陆官网上进行查看 -- https://github.com/go-delve/d... --

MJrimeM.png!web

aeYnMfy.png!web

对于delve在官方网站上有比较详细的说明,而且安装情况也是非常简单。我们只需要点击installation中的windows。

imeuyy7.png!web

注意:如果在模块模式下使用Go,则必须在模块目录之外执行此命令,否则Delve将作为依赖项添加到项目中。

另外,如果尚未设置,则必须将%GOPATH% bin目录添加到PATH变量中。

7rUZNbB.png!web

当我们进行下载成功后需要添加到我们的环境变量中,

iIjM7rf.png!web

当然也可以通过%GOPATH%bin来进行添加即可。所以对于delve的安装按照官方的文档进行下去还是非常方便和快捷。进行完安装后我们就可以开始我们实战演练部分,对于我们的代码进行调试。

对于delve的常用命令我们可以通过dlv –-help 来进行了解

7buQ7bn.png!web

PS:踩坑日记:很多小伙伴也有反馈即使我们安装完delve在goland中也无法使用我们的delve来进行代码的调试,因为goland中出现

Version of Go is too old for this version of Delve (minimum supported version 1.13, suppress this error with --check-go-version=false

要解决这个方法很简单,我们在gopath中安装好delve后会生成bin目录,在bin文件夹中会有dlv.exe

ZzAZ7vi.png!web

然后我们只需要在goland中进行配置一下即可。

M3yAJvb.png!web

然后添加相应的dlv.path为你gopath下的dlv.exe路径,然后重启即可

3e2Arer.png!web

实操演练:

这里我准备了一个简单的项目进行调试

2aaA3i2.png!web

如图所示可以看到这个是一个非常简单的web服务器代码

eqAVZ3y.png!web

然后我们进入到相应dos界面执行dlv debug main.go

muEbIfQ.png!web

我们可以用sources来进行查看源文件。

Ajq2EzJ.png!web

以下是给大家罗列了一些关于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 ---------------------- 打印表达式的类型.

在命令前键入help来获得命令的完整文档,如help goroutine

接下来就是进行断点的标注,我们可以使用 b 代码位置:行数 进行标注。

uyY7bif.png!web

标注完成后 直接输入c 可以进行查看源代码。

3aueqei.png!web

使用next 可以进行下一步,进行调试。

nUriaa3.png!web

bay2Ijq.png!web

当然针对更多的dlv命令还需要小伙伴们下来之后进行多多尝试才行。相互学习,共同进步,我是小栈君,我们下期再见!

欢迎关注我们的微信公众号,每天学习Go知识

FveQFjN.jpg!web

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK