go1.7.3 の go コマンドを gdb でデバッグする

More than 1 year has passed since last update.


はじめに

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


参考