8
6

More than 5 years have passed since last update.

Go のデバッガ

Last updated at Posted at 2018-08-29

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 の設定はこんな感じ。modeexec を設定する。

その他 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 のデバッガが使えるだけで急に万能感が出る。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6