

コンテナ開発環境(DevContainers@VSCode) × ホットリロード(air) × ステップインデバッグ(delve)の環境構築メモ
DevContainersならコンテナ内のローカルホストのデバッガポートに直接アタッチ出来るのでシンプルに構成可能できる。
アーキ概要
コンテナ
golang:1.22.11-alpine3.21
delve デバッガ
インストール
go install github.com/go-delve/delve/cmd/dlv@latest
コマンドパレットのGo Install/Update Tools
からインストールでもOK
※VSCodeServer@コンテナにGoエクステンションが入っていること
Air ホットリロード
バイナリインストールと環境初期化
go install github.com/air-verse/air@latest \
&& cd path/to/app_root
&& air init #=> ./.air.tomlが生成される
.air.tomlコンフィグをデバッグ向けに編集
[build]
# ビルド設定
cmd = "go build -gcflags=\"all=-N -l\" -o ./tmp/main ."
# 起動設定
# --logオプションで標準出力に詳細ログを出力
full_bin = "dlv --headless=true --listen=:2345 --api-version=2 --accept-multiclient exec --continue ./tmp/main"
# その他はデフォルト
ノーマルビルドと比較してデバッグビルドは時間はかかるようになった
-gcflags="all=-N -l"
デバッガ(delve など)を使う場合、Go の最適化が入っていると変数の値が見えなくなったり、
関数がインライン化されてブレークポイントが期待通り動かなくなることがあるので、Go コンパイラの最適化を無効化するためのオプションを指定する
オプションについて
-
-N
: 最適化を無効化してデバッグしやすくする -
-l
: インライン展開を無効化して関数のインライン化を防ぐ
full_bin = "dlv --headless=true --listen=:40000 --api-version=2 --accept-multiclient exec --continue ./tmp/main"
dlv exec
でビルドバイナリ./tmp/main
をデバッグ実行する
オプションについて
- —headless=true により、CLI(ターミナル)ではなく、エディタや別のデバッガから接続できる
- --listen=:2345により、ポート2345にデバッガを待機
- --accept-multiclient により、複数のクライアント(VSCode, GoLand など)から同時に接続できる
- --continue により、Delve 起動時に自動的にプログラムを実行(手動で continue を打たなくて済む)
VSCode
デバッグ構成はアタッチ式で
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach Server",
"type": "go",
"request": "attach",
"mode": "remote",
"port": 2345,
"host": "localhost",
"showLog": true
}
]
}
デバッグ
- アプリケーションディレクトリでairを実行する
cd path/to/app_root && air
- VSCodeの
実行とデバッグ
>Attach Server
でアタッチ開始 - ブレークポイントを設定してhttpリクエストを入れたらブレークする