Go:
デバッガの使用

方法:

Goはdelveと呼ばれる組み込みのデバッグ機能を提供しています。これはフル機能のデバッグツールで、Goプログラムをステップ実行し、プログラム変数を調査し、式を評価することができます。

始めるには、まずdelveをインストールする必要があります。以下を実行することでインストールできます:

go get -u github.com/go-delve/delve/cmd/dlv

これで、簡単なGoプログラムをデバッグする準備が整いました。プログラムmain.goを考えましょう:

package main

import "fmt"

func main() {
    message := "Debugging in Go"
    fmt.Println(message)
}

このプログラムをデバッグを開始するには、プロジェクトのディレクトリでターミナルを開き、次を実行します:

dlv debug

このコマンドは、デバッグ体験を改善するために最適化を無効にしてプログラムをコンパイルし、それを起動してデバッガをアタッチします。

delveが実行されると、インタラクティブなデバッガシェルに入ります。いくつかの基本的なコマンドは以下の通りです:

  • break main.mainmain関数にブレークポイントを設定します。
  • continue はプログラムの実行をブレークポイントがヒットするまで再開します。
  • print messagemessage変数の値を出力します。
  • next はプログラムの実行を次の行へ進めます。
  • quit はデバッガを終了します。

ブレークポイントに到達して変数を出力した際の出力は、以下のようになります:

Breakpoint 1 at 0x49ecf3 for main.main() ./main.go:6
> main.main() ./main.go:6 (hits goroutine(1):1 total:1) (PC: 0x49ecf3)
     1: package main
     2:
     3: import "fmt"
     4:
     5: func main() {
     6: =>    message := "Debugging in Go"
     7:       fmt.Println(message)
     8: }
(dlv) print message
"Debugging in Go"

これらのコマンドを使用して、プログラムをステップごとに進めながら状態を確認し、挙動を理解し、問題を特定することができます。

深堀り

Goの実行モデルとランタイムの性質により、GDB(GNU Debugger)などの従来のツールではなくdelveがGoのデバッガとしての選択肢となっているのはそのためです。GDBは最初からGoランタイムを念頭に置いて設計されていなかったため、delveがGo開発者にとってより適した選択肢となります。DelveはGo専用に設計されており、Goルーチン、チャネル、その他のGo固有の構成要素のデバッグ体験をより直感的にすることができます。

さらに、delveはGoプログラムで働く際、GDBが提供する基本機能に加えて、実行中のプロセスへのアタッチ、条件付きブレークポイント、Goの並行性プリミティブを含むかもしれない複雑な式の評価など、幅広い機能をサポートしています。

delveが多くのGo開発者にとってのデフォルトのデバッガであるとはいえ、Goツールチェーンには、プロファイリング用の組み込みpprofツールや、並行性の可視化用のtraceツールなど、より軽量なデバッグサポート形式も含まれています。これらのツールは、プログラムのパフォーマンス問題や並行性バグを診断するためのより速いまたはより高レベルの方法を提供することがあり、デバッグの文脈によっては、補完的またはより好ましい選択肢となることもあります。