はじめに
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 を用いてデバッグを行うことができる.
その前に何かソースコードを生成する.
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
参考
-
- https://golang.org/doc/gdb
-
- https://golang.org/doc/install/sourcec
- https://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/11.2.html