ファイル
こんなファイルがある場合
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 を認識してくれていないが、まだ使い始めたばかりなのでよく分かっていない)
参考
Original by Github issue
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。