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

  • 5
    いいね
  • 0
    コメント

はじめに

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

参考