🖥

Go言語のdelve でブレークポイントを設定してデバッグ実行する ( #go / dlv cli / dlv debug / set b

2020/03/16に公開

ファイル

こんなファイルがある場合

package main

import (
	"fmt"
)

func main() {
	fmt.Println("A")
	fmt.Println("B")
	fmt.Println("C")
	fmt.Println("D")
	fmt.Println("E")

	foo()
}

func foo() {
	value := "FOO"
	fmt.Println(value)
}

delveの実行

go run みたいにファイル名を指定して実行する

dlv debug go/dlv/main.go

ブレークポイントの指定

ファイル名+行数指定で3つのブレークポイントを指定してみる

例: break main.go:9

(dlv) break main.go:8
Breakpoint 1 set at 0x10c23af for main.main() ./go/dlv/main.go:8
(dlv) break main.go:10
Breakpoint 2 set at 0x10c2485 for main.main() ./go/dlv/main.go:10

実行

continue すると、ひとつずつ進める!
ブレークポイントの残りがなくなり、スクリプトが処理を完了すると、終了する。

(dlv) continue
> main.main() ./go/dlv/main.go:8 (hits goroutine(1):1 total:1) (PC: 0x10c23af)
     3:	import (
     4:		"fmt"
     5:	)
     6:
     7:	func main() {
=>   8:		fmt.Println("A")
     9:		fmt.Println("B")
    10:		fmt.Println("C")
    11:		fmt.Println("D")
    12:		fmt.Println("E")
    13:
(dlv) continue
A
B
> main.main() ./go/dlv/main.go:10 (hits goroutine(1):1 total:1) (PC: 0x10c2485)
     5:	)
     6:
     7:	func main() {
     8:		fmt.Println("A")
     9:		fmt.Println("B")
=>  10:		fmt.Println("C")
    11:		fmt.Println("D")
    12:		fmt.Println("E")
    13:
    14:		foo()
    15:	}
(dlv) continue
C
D
E
FOO
Process 54908 has exited with status 0

再実行

restart で最初から実行できる!

(dlv) restart
Process restarted with PID 54942

ブレークポイントをすべてクリアする

(dlv) clearall
Breakpoint 1 cleared at 0x10c23af for main.main() ./go/dlv/main.go:8
Breakpoint 2 cleared at 0x10c2485 for main.main() ./go/dlv/main.go:10

function + 行数指定でブレークポイントを設定する

(dlv) break foo:2
Breakpoint 3 set at 0x10c2616 for main.foo() ./go/dlv/main.go:19
(dlv) continue
A
B
C
D
E
> main.foo() ./go/dlv/main.go:19 (hits goroutine(1):1 total:1) (PC: 0x10c2616)
    14:		foo()
    15:	}
    16:
    17:	func foo() {
    18:		value := "FOO"
=>  19:		fmt.Println(value)
    20:	}

変数の中身を表示してみる
Go言語の文法が使えるわけじゃなくて CLI のコマンドで表示させるみたいだ

(dlv) print value
"FOO"

ブレークポイントの指定方法

いくつかあるみたいだ。

delve/locspec.md at master · go-delve/delve

(ここに書いたやり方だと、なぜかcurrent file を認識してくれていないが、まだ使い始めたばかりなのでよく分かっていない)

参考

Golangのデバッガdelveの使い方 - Qiita

Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3032

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2020-03-16

Discussion