golang调试利器 dlv 的使用(golang gdb调试)

Github地址: 

golang调试利器 dlv 的使用(golang gdb调试)

如果是在本地调试,直接通过命令将其安装到本地的下即可

容器环境下由于不一定支持 go,需要先安装 go 语言环境,会比较麻烦,可以直接将本地下载好的二进制命令复制到的某一个目录中。

安装好后,通过执行验证是否可用。

使用编译时,默认会进行一些优化,会影响调试过程。

因此,对于对于需要进行调试的程序,在编译时最好设置把优化关掉。

  • 在>= 1.10的 golang 版本中,设置
  • 在<1.10版本的 golang 中,设置

其中:

表示不优化代码,并生成调试信息。

表示禁用函数内联优化

如下面命令将当前文件夹下的代码编译成可执行文件,并禁止优化:

用于调试一个已经存在的进程,这个命令一般在调试 web 程序时使用。如下:

  • 使用命令查看占用某个端口的进程 pid
  • 使用启动调试该进程

比如假定某个 web 程序的 http端口为 8080,进程号为10001

如果没有现成的进程,而只有一个二进制可执行文件,可以使用命令启动一个进程并进行调试,如上面生成的

如果 main 程序本身需要一些参数,可以通过来传递参数,比如给上面的 main 传入一个 conf 参数

用于直接调试源码文件,这个命令连手动编译都省了,只需要指定调试的包名和源码所在的文件夹即可。

调试测试文件,用的不多

用于查看使用手册

用于查看版本号,如下:

通过、、进入 dlv 的调试终端后,需要执行调试指令才能完成诸如下一步、退出当前函数、查看变量值等目的。

主要是断点的增删改查

指令缩写作用 break b 添加断点 breakpoints bp 用于查看设置的所有断点,每个断点都有一个编号 clear   如clear 1,表示删除编号为 1 的断点 clearall   删除所有断点 toggle   用于启用/禁用断点。如toggle 1 condition cond 用于设置条件断点,如cond 2 i == 10指定断点 2 在 i等于 10 时执行

需要注意的是,使用  创建断点时,有几种方法:

  • : 在指定包的函数中设置断点,如。如果函数名全局唯一,则不用指定包名
  • : 在指定的 go 文件的指定行设置断点,如

主要用于控制程序的执行

指令缩写作用 next n 执行到下一行,如果是函数,不会进入函数 continue c 执行到下一个断点处或结束执行 step s 执行到下一步,如果是函数,会进入函数内部 stepout so 跳出当前函数 restart r 重新执行程序,断点会保留。注意无法用于 attach 的进程 step-instruction si 执行到下一行机器码,一般在查看汇编代码时使用 rebuild   重新编译程序并执行,断点会保留。无法用于 attach 和 exec

主要用于对设置和查看变量、参数等

指令缩写作用 print p 查看变量或表达式的值 whatis   查看变量类型 args   查看函数的入参 locals   查看函数的局部变量 vars   查看全局变量 set   设置某个变量的值 display   将变量加入/移除监控列表、或查看监控列表

注意上述locals/vars/display都支持指定正则,具体用法可以使用查看。

指令缩写作用 exit q 退出调试会话 disassemble disass 用于查看指定函数的汇编代码 funcs   查看函数,同样支持正则 help h 查看使用手册 list ls/l 查看源代码

本文介绍了工具的基本使用姿势,掌握该工具,不仅能够辅助我们进行调试,以后想学习一些项目的原理时,也能够很快摸清楚调用链路。

后续我的其他分析原理性的文章中,也会使用使用这一工具对源代码进行分析。

原文: https://zhuanlan.zhihu.com/p/655096453

 

转载请说明出处 内容投诉内容投诉
九幽软件 » golang调试利器 dlv 的使用(golang gdb调试)