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

前端之家收集整理的这篇文章主要介绍了【Go学习】Golang源码编译和gdb调试环境搭建前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

原文链接:https://www.f2er.com/go/187122.html

猜你在找的Go相关文章