Hi,你们好,我是明哥。linux
在本身学习 Golang 的这段时间里,我写了详细的学习笔记放在个人我的微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,所以写的东西应该会比较适合刚接触的同窗,若是你也是刚学习 Go 语言,不防关注一下,一块儿学习,一块儿成长。git
个人在线博客:golang.iswbm.com 个人 Github:github.com/iswbm/GolangCodingTimegithub
作为新手,熟练掌握一个好的调试工具,对于咱们学习语言或者排查问题的时候,很是有帮助。golang
你若是使用 VS Code 或者 Goland ,能够直接上手,我就再也不写这方面的文章了。shell
其实相比有用户界面的 IDE 调试工具,我更喜欢简单直接的命令行调试,缘由有三点:编程
若是你有和我同样的感觉和习惯,能够看下今天的文章,介绍的是 GDB 调试工具。服务器
在 Linux 上进行调试,那咱因此得先安装 Go ,因为第一节里只讲了 Windows 的下载安装,并无讲到在 Linux 上如何安装。因此这里要先讲一下,已经安装过了能够直接跳过。微信
首先在 go 下载页面上(golang.org/dl/),查看并复制源…函数
登录 linux 机器 ,使用 wget 下载工具
$ wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz复制代码
将下载的源码包解压到 /usr/local
目录下,并设置环境变量
[root@localhost ~]# tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz
[root@localhost ~]#
[root@localhost ~]# export PATH=$PATH:/usr/local/go/bin
[root@localhost ~]# which go
/usr/local/go/bin/go
[root@localhost ~]#
[root@localhost ~]# go version
go version go1.14.2 linux/amd64
[root@localhost ~]# 复制代码
调试使用的是 GDB (好像要求版本 7.1 + ),使用前,请先确保你的机器上已经安装 GDB
[root@localhost code]# which gdb
/usr/bin/gdb复制代码
准备就绪后,先在目录下写一个测试文件
package main
import "fmt"
func main(){
msg := "hello, world"
fmt.Println(msg)
}复制代码
而后执行 以下命令进行编译,里面有好多个参数,有疑问的能够自行搜索引擎
# 关闭内联优化,方便调试
$ go build -gcflags "-N -l" demo.go
# 发布版本删除调试符号
go build -ldflags “-s -w”复制代码
最后使用 GDB 命令进入调试界面
# 若是你喜欢这种界面的话,用这条命令
$ gdb -tui demo
# 若是你跟我同样不喜欢不习惯用界面,就使用这个命令
$ gdb demo复制代码
完整操做以下:
进入 GDB 调试界面后,并非当即可用,你先须要回车,而后再你敲入几行命令,调试窗口就会出现代码。
(gdb) b main.main # 在 main 包里的 main 函数 加断点
Breakpoint 1 at 0x4915c0: file /home/wangbm/code/demo.go, line 5.
(gdb) run # 执行进程
Starting program: /home/wangbm/code/demo
Breakpoint 1, main.main () at /home/wangbm/code/demo.go:5
(gdb) 复制代码
要熟练使用 GDB ,你得熟悉的掌握它的指令,这里列举一下
r
:run,执行程序
n
:next,下一步,不进入函数
s
:step,下一步,会进入函数
b
:breakponit,设置断点
l
:list,查看源码
c
:continue,继续执行到下一断点
bt
:backtrace,查看当前调用栈
p
:print,打印查看变量
q
:quit,退出 GDB
whatis
:查看对象类型
info breakpoints
:查看全部的断点
info locals
:查看局部变量
info args
:查看函数的参数值及要返回的变量值
info frame
:堆栈帧信息
info goroutines
:查看 goroutines 信息。在使用前 ,须要注意先执行 source /usr/local/go/src/runtime/runtime-gdb.py
goroutine 1 bt
:查看指定序号的 goroutine 调用堆栈
回车:重复执行上一次操做
其中有几个指令的使用比较灵活
好比 l - list,查看代码
# 查看指定行数上下5行
(gdb) l 8
# 查看指定范围的行数
(gdb) l 5:8
# 查看指定文件的行数上下5行
l demo.go:8
# 能够查看函数,记得加包名
l main.main复制代码
把上面的 l
换成 b
,大多数也一样适用
# 在指定行打断点
(gdb) b 8
# 在指定指定文件的行打断点
b demo.go:8
# 在指定函数打断点,记得加包名
b main.main复制代码
还有 p - print,打印变量
# 查看变量
(gdb) p var
# 查看对象长度或容量
(gdb) p $len(var)
(gdb) p $cap(var)
# 查看对象的动态类型
(gdb) p $dtype(var)
(gdb) iface var
# 举例以下
(gdb) p i
$4 = {str = "cbb"}
(gdb) whatis i
type = regexp.input
(gdb) p $dtype(i)
$26 = (struct regexp.inputBytes *) 0xf8400b4930
(gdb) iface i
regexp.input: struct regexp.inputBytes *复制代码
以上就是关于 GDB 的使用方法,很是简单,能够本身手动敲下体验一下。
参考文章