Debugging Go Code with GDB によれば、Go のおすすめデバッガは delve らしい。
go get -u github.com/derekparker/delve/cmd/dlv
デバッグに必要なコンパイルオプション
ここでは、dlv exec によってバイナリをデバッグする方法を紹介しています。もしも dlv debug を使うと自動的にビルドされるためこのコンパイルオプションは不要です。
go build -gcflags=all='-N -l'
-
-gcflags '[pattern=]arg list'
: go tool compile に渡すオプション。- デフォルトではコマンドラインで指定したパッケージだけ有効になる。全てのパッケージで有効にするには、
gcflags=all='-N -l'
のようにする。
- デフォルトではコマンドラインで指定したパッケージだけ有効になる。全てのパッケージで有効にするには、
-
-N
: 最適化無効 -
-l
: インライン化無効
参考
コンソールでデバッグ
dlv exec 実行ファイル
で起動する。元のプログラムにオプションを渡すには -- のあとに置く。
デバッグセッションで使えるコマンドは https://github.com/derekparker/delve/tree/master/Documentation/cli に記載されている。
$ dlv exec ./myprogram -- runService
Type 'help' for list of commands.
(dlv) break main.main
Breakpoint 1 set at 0x15b5fff for main.main() ./cmd/myprogram/main.go:13
(dlv) step
> main.main() ./cmd/myprogram/main.go:13 (hits goroutine(1):1 total:1) (PC: 0x15b5fff)
Warning: debugging optimized function
8: "fmt"
9: "project/myprogram/cmd/myprogram/cmd"
10: "go.uber.org/zap"
11: )
12:
=> 13: func main() {
14: defer func() {
15: if r := recover(); r != nil {
16: logger, _ := zap.NewProduction(zap.AddCaller())
17: logger.Fatal(fmt.Sprintf("%v", r))
18: }
Visual Studio Code でデバッグ
OSX の場合、このままでは VSCode との連携が出来ない。自己署名されたバイナリを生成して VSCode と連携するためにはソースコード上で make install
する。
$ cd $GOPATH/src/github.com/derekparker/delve
$ make install
scripts/gencert.sh || (echo "An error occurred when generating and installing a new certificate"; exit 1)
Password:
go install -ldflags="-s -X main.Build=63c880780ff1e9ef7c765f19117770428badee32" github.com/derekparker/delve/cmd/dlv
codesign -s "dlv-cert" /gopath/bin/dlv
ビルドしたバイナリをデバッグしたい場合、.vscode/launch.json
の設定はこんな感じ。mode
に exec
を設定する。
その他 Debugging Go code using VS Code に有用な情報が沢山あるので参考にする。
{
"version": "0.2.0",
"configurations": [
{
"name": "runService",
"type": "go",
"request": "launch",
"mode": "exec",
"remotePath": "",
"port": 2345,
"host": "127.0.0.1",
"program": "${workspaceFolder}/src/project/myprogram/myprogram",
"env": {},
"args": ["runService"],
"showLog": false
}
]
}
GUI のデバッガが使えるだけで急に万能感が出る。