【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的调试环境,后续更多研究之后,再补充。