【Go学习】Golang源码编译和gdb调试环境搭建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xj178926426/article/details/80522122

【Go学习】Golang源码编译和gdb调试环境搭建

GO可以说是近几年最热门的新兴语言之一了, 一般人看到分布式和大数据就会想到GO。本文主要是来编译一下go的源码,然后搭建gdb的调试环境。

源代码是Google官方的实现的1.10.2版本, 不适用于其他版本和gccgo等其他实现,
运行环境是CentOS Linux release 7.5.1804.

编译golang源代码

go的源代码是用go写的, 编译也需要一个可运行的go.
首先我们从官网下载源代码和二进制文件。
go1.10.2.src.tar.gz
go1.10.2.linux-amd64.tar.gz

注意两个压缩包解压出来文件夹名称都是go,所以不要在同一个目录下进行解压。go环境的安装可以查看我之前的一个文章—-Centos7 VS code golang 开发环境搭建,这里就不再赘述。

我的go环境安装解压路径(就是上面的go二进制文件的解压路径):
/home/james/opt/go
上面的go源码的解压路径:
/home/james/workspace/go_src
为了方便我把解压之后的文件夹重命名为go_src。

编译go之前需要设置环境变量:
GOROOT_BOOTSTRAP 是go二进制文件夹的所在目录,
GO_GCFLAGS 是编译go时使用的参数。

export GOROOT_BOOTSTRAP=~/opt/go
export GO_GCFLAGS="-N -l"

这里的-N参数代表禁止优化,-l参数代表禁止内联, go在编译目标程序的时候会嵌入运行时(runtime)的二进制,
禁止优化和内联可以让运行时(runtime)中的函数变得更容易调试.

都准备好以后就可以进入go的源代码文件夹(/home/james/workspace/go_src)执行all.bash编译了:
这里写图片描述
坐等几分钟,编译的结果在/home/james/workspace/go_src/bin下,注意你们自己的目录可能跟我的不一样。:
这里写图片描述

调试golang源代码

下面我们使用gdb来进行调试,我们以以下源码(hello.go)为例:

package main 

import "fmt"

func main() {
    var c int = 0
    a,b := 1,2
    c = a + b 
    fmt.Printf("c : %d\n",c);
    fmt.Printf("Hello Wrold\n")
}

编译源代码使用以下命令, 这里的-l参数的意思和上面一样, 如果有需要还可以加-N参数:

/home/james/workspace/go_src/bin/go build -gcflags "-l" hello.go

编译后使用gdb运行:

gdb ./hello

这里写图片描述

go里面的函数符号名称的命名规则是包名称.函数名称, 例如主函数的符号名称是main.main, 运行时中的newobject的符号名称是runtime.newobject.
首先给主函数下一个断点然后运行:
这里写图片描述
可以看到成功的进入了主函数, 并且有源代码提示.
接下来给按文件名和行数来下断点:
这里写图片描述
可见,在我使用的环境中gdb可以正常的下断点, 步进和步过go代码,但打印变量输出的值有可能是错的, 即使不开启优化。

总结

目前只是简单的搭建了gdb的调试环境,后续更多研究之后,再补充。

猜你喜欢

转载自blog.csdn.net/xj178926426/article/details/80522122