qq591577286 发表于 2018-9-19 12:34:32

Golang源码探索(一) 编译和调试源码

  GO可以说是近几年最热门的新兴语言之一了, 一般人看到分布式和大数据就会想到GO,
  
这个系列的文章会通过研究golang的源代码来分析内部的实现原理,
  
和CoreCLR不同的是, golang的源代码已经被很多人研究过了, 我将会着重研究他们未提到过的部分.
  另一点和CoreCLR不同的是, golang的源代码非常易懂, 注释也非常的丰富,
  
很明显Google的工程师在写代码的时候有考虑其他人会去看这份代码.
  尽管代码非常易懂, 研究它们还是需要实际运行和调试才能得到更好的理解,
  
这个系列分析的golang源代码是Google官方的实现的1.9.2版本, 不适用于其他版本和gccgo等其他实现,
  
运行环境是Ubuntu 16.04 LTS 64bit.

编译golang源代码
  go的源代码是用go写的, 编译也需要一个可运行的go.
  
首先我们从官网下载源代码和二进制文件.
  go1.9.2.src.tar.gz
  
go1.9.2.linux-amd64.tar.gz
  注意两个压缩包解压出来文件夹名称都是go, 我们解压到以下目录:
  

源代码: ~/git_go/go_src  
二进制: ~/git_go/go_bin
  


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

export GOROOT_BOOTSTRAP=~/git_go/go_bin  
export GO_GCFLAGS="-N -l"
  

  这里的-N参数代表禁止优化, -l参数代表禁止内联, go在编译目标程序的时候会嵌入运行时(runtime)的二进制,
  
禁止优化和内联可以让运行时(runtime)中的函数变得更容易调试.
  都准备好以后就可以进入go的源代码文件夹执行all.bash编译了:

  编译的结果在~/git_go/go_src/bin下:


调试golang源代码
  之前CoreCLR的系列中我使用了lldb, 在这个系列中我继续沿用这个调试器.
  
这个系列中使用的是lldb 4.0.
  以以下源代码(hello.go)为例:
  

package main  

  
import (
  "fmt"
  "time"
  
)
  

  
func printNumber(from, to int, c chan int) {
  for x := from; x
页: [1]
查看完整版本: Golang源码探索(一) 编译和调试源码