🕌

開発環境の整備のためのDelve設定

2024/02/10に公開

概要

EchoのAPI開発環境の整備のためにDelveを導入する。
また、airが導入済みの環境なので共存を目指す。

Delveとは

Goのコードデバックできるようにするライブラリとなっている。
https://github.com/derekparker/delve
使い方に困惑するところがあるのだが、IDEと組み合わせることで実行処理を途中で止めれるようになりので、うまく動作しないときや実装の結果確認といった確認作業がリアルタイムできるようになる。確認のためのログ仕込みとかが不要になるのでGoの開発においては導入しておくと便利だと思っている。
イメージ的には、Railsのbyebugに近いものではある。
IDEと組み合わせないとコンソール上でブレークポイントの設置などをしなくてはならないです。

Delveの導入

利用しているDockerfileに以下のコマンドを追加する

RUN go install github.com/go-delve/delve/cmd/dlv@latest

その後、docker compose buildを行いコンテナを再作成する。
コンテナ起動後に

dlv version

(実行結果)
Delve Debugger
Version: 1.22.0
Build: $Id: 61ecdbbe1b574f0dd7d7bad8b6a5d564cce981e9 $

を実行してVersion情報が取得できれば導入は完了です。

Delveの使い方

基本的な使い方は、起動コマンドを

dlv debug main.go

(実行結果)
(dlv) 

で起動するとデバックモードで起動します。
起動に成功するとdlv入った状態でコマンド入力できる状態になります。
いくつか利用できるコマンドを紹介します。

funcs 関数確認

(dlv) funcs main\..*

関数確認コマンドになります。
ワイルドカードも利用でき、該当を一覧で出力してくれます。

list ソースコード確認

(dlv) list main.main

該当関数のソースコードが確認できます。

(dlv) list main.main:3

該当関数の指定行のコードを確認できます。

break ブレイクポイントの設定

(dlv) break main.main

該当関数をブレイクポイントに設定します。

(dlv) break main.main:3

該当関数の指定行のコードをブレイクポイントに設定します。

breakpoints ブレイクポイントの確認

(dlv) breakpoints

現在設定しているブレイクポイントの確認ができます。

処理を進める

continue 次のブレイクポイントまで進める。
next 1行処理を進める(ステップオーバー)。
step 1行処理を進める。
stepout 現在の関数から抜ける。

といったコマンドが用意されている。

他にも変数の上書きなども用意されているので使いこなせれば開発効率が上がってくることが間違いないが、コンソールを使わなければいけないことが難点・・・・・
しかし、CLI方式だけでなく、外部からデバッカーを接続するリモートデバック機能があります。
この機能を使うほうが利用したツールに合わせた対応ができるようになるので一般的かもしれません。リモートデバックは起動時のコマンド指定が必要になるのですでに導入しているairとの共存しながらできるようにします。

airとの共存

追加のインストール対応はなく、airの設定している.air.tomlファイルを編集します。


cmd = "go build -o ./tmp/main ."

bin = "tmp/main"

full_bin = "APP_ENV=dev APP_USER=air dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec --continue ./tmp/main"

一番大事なポイントはfull_binの内容です。dlvコマンド時に--linstenなどのパラメータを追加することでリモートデバックが可能になります。
今回の設定ではリモートデバックとして2345ポートを使用する設定になっています。
Docker環境なので、docker-compose.ymlのポートでも2345ポートを利用できるように追記することを忘れないようしましょう。

Goland設定編

私はGolandを普段使っていますが、IDEの設定方法は

  1. 右上から実行構成の編集を選択
  2. +アイコンをクリックして、Go リモートを選択
  3. 以下のキャプチャにホスト、ポート、切断時の設定します。

設定画面

で設定完了です。
デバックで止めたいときなどにデバック実行しておけば、IDE上で設定したブレイクポイントで処理が止まるようになります。
処理の進め方などもほかのデバック処理時の扱いと同じになります。

VSCode設定編

VSCodeでは、実行とデバックのメニューから設定追加をし、
.vscode/launch.jsonを用意します。
ファイルの内容は

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Remote",
      "type": "go",
      "request": "attach",
      "mode": "remote",
      "remotePath": "",
      "port": 2345,
      "host": "localhost",
      "cwd": "${workspaceRoot}",
      "env": {},
      "args": []
    }
  ]
}

を記載して保存。
デバックで止めたいときにこちらを起動すれば、VSCode上でのブレイクポイントが有効になります。

最後に

今回は開発環境を用意するためにDelveを導入して、デバックしやすい環境を用意しました。
調べると他のライブラリでもやれるようですが、Delveに乗り換えたみたいな記事も見られたので主流な方法なように思えました。
デメリットとしては、本番環境に適応するときにはDelveを入れたくないのでDockerfileは使い分ける必要があることくらいですかね。
個人的には細かく状態を確認していきたい派なのでテストコードを細かい粒度で作成するだけでなく、
実態が確認できるDelveは使い道がたくさんあるライブラリとなっています。

GitHubで編集を提案

Discussion