はじめに
go は基本的に最適化を行ってビルドが行われる. ゆえに実行された関数や変数の値はレジスタへ保存されるため, 最適化を無効化し, それぞれの値の情報を見られるようにするため,
go build -gcflags '-N -l’ sample.go
を行う必要がある.
今回のデバッグは go1.7.3 を使用する.
go1.4 のビルド
後々 $GOROOT_BOOTSTRAP
が必要になるため,
git clone -b release-branch.go1.4 https://go.googlesource.com/go $HOME/go1.4
cd $HOME/go1.4/src
./make.bash
を行う.
go1.7.3 の ./all.bash
の $GOROOT_BOOTSTRAP
のデフォルト値は $HOME/go1.4
である.
go1.7.3 の go
コマンドのビルド
現時点(2016-11-04)で最新の安定されたバージョンをビルドする.
git clone -b release-branch.go1.7 https://github.com/golang/go.git && cd go/src
デバッグ用として今回のターゲットである go
コマンドのビルドを行う.
$ ./make.bash
$ export GOROOT=$HOME/go
$ cd cmd/go && go build -gcflags '-N -l' -o ../../../bin/go
$ cd ../../../bin
これで gdb
を用いてデバッグを行うことができる.
その前に何かソースコードを生成する.
main.go
package main
func main() {
title := "Hello, World"
println(title)
}
これをビルドするように gdb
を実行する.
$ gdb ./go
この時,
Reading symbols from ./go...done.
Loading Go Runtime support
のように表示されていれば成功である.
(gdb) b main.main
(gdb) r build ./main.go