LoginSignup
3
1

More than 1 year has passed since last update.

Go言語のdelve でブレークポイントを設定してデバッグ実行する ( #go / dlv cli / dlv debug / set break point and debug with single go lang file )

Last updated at Posted at 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

チャットメンバー募集

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

Twitter

3
1
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
3
1