Help us understand the problem. What is going on with this article?

Visual Studio CodeでGo言語のデバッグ環境を整える

はじめに

Visual Studio Code(以下VSCode)にてGo言語開発のデバッグができるようにするまでを示します。

前提条件

追記 2020年11月15日更新 動作確認済み

  • MacOS (筆者の環境は macOS Catalina version 10.15.7)
  • GoはMacOSにインストール済み (筆者の環境は go1.15 darwin/amd64)
  • $GOPATHを設定済み
  • $GOPATH\binを環境変数$PATHへ追加済み
  • VSCodeをインストール済み (筆者の環境は Version: 1.51.1)

設定内容

delveをインストール

VSCodeでGoのデバッグをするにはdelveというデバッガツールをインストールする必要があります。delve自体は単独のコマンドラインで利用するデバッガでVSCodeがそれをラップしています。

Xcodeにて必要なツールをインストール

$ xcode-select --install

既にインストール済みの場合は下記のメッセージが出ます。

xcode-select: error: command line tools are already installed, use "Software Update" to install updates

delveをインストール

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

問題が発生してしまう場合は、こちらの公式ページを確認してみてください。

MacOSへのインストールではbrewを利用してOSへインストールも可能ですが、証明書取得の手間が出るので$GOPATH\binを環境変数$PATHへ追加し、go getでdelveのバイナリを$GOPATH\binへインストールした方がやりやすいです。
追記 2020年11月15日 時点での公式ドキュメントにはMacOSにてHomebrewでのインストールの記載はなくなっています。

dlvがインストールされたか確認

$ dlv version
Delve Debugger
Version: 1.5.0
Build: $Id: ca5318932770ca063fc9885b4764c30bfaf8a199 $

VSCodeにGo言語の拡張機能をインストール

VSCodeにて下記のGo言語用の拡張機能がインストールされていなければしましょう。

Rich Go language support for Visual Studio Code

VSCodeの$GOPATHを確認

SHELL設定の関係などで$GOPATHが普段のターミナルとVSCodeでは異なる場合があるので確認します。

統合ターミナルを開く(ショートカット control+` )

$ echo $GOPATH

出力が、想定した$GOPATHであることを確認します。

デバッグ

デバッグ対象のプログラムがあるディレクトリを開きデバッグビューを開きます。

ブレークポイントを指定しデバッグアイコンよりデバッグができます。

image.png

このとき以下のlaunch.jsonファイルがVSCode上で開いているディレクトリに作成されます。

.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}",
            "env": {},
            "args": []
        }
    ]
}

launch.jsonにて重要なフィールド

"program"

デバッグ対象の実行ファイルまたはエントリポイントのファイルが存在するディレクトリのPathを指定します。
デフォルトでは${fileDirname}という予約語が設定されており、これは「現在開いているファイルのディレクトリ名」を意味しています。

下記はVSCodeでのprogramに対する予約語の一覧です。

予約語 意味
${workspaceFolder}                                       VSコードで開いたディレクトリのパス
${workspaceFolderBasename} スラッシュのないVSコードで開いたフォルダの名前
${file} 現在開いているファイル
${relativeFile} workspaceFolderを基準とした現在開いているファイル
${fileBasename} 現在開いているファイルのベース名
${fileBasenameNoExtension} ファイル拡張子を持たない現在開いているファイルのベース名
${fileDirname} 現在開いているファイルのディレクトリ名
${fileExtname} 現在開いているファイルの拡張子
${cwd} 起動時のタスクランナーの現在の作業ディレクトリ
${lineNumber} 現在開いているファイル内にて選択されている行番号

"mode"

デフォルトはautoモード。上記実行ではdebugモードで起動しており、programで指定したプログラムをコンパイルしデバッガー配下で実行します。

以下は"mode"タグの一覧です。

mode名 意味
auto                    起動時に自動で判断して下記のモードのいづれかになる。 [デフォルト]
debug プログラムフォルダの内容をコンパイルし、デバッガの下で起動する。
test プログラムフォルダ内のテストをデバッグする。 単一のテストをデバッグするには、test.runとTest名をargsとして渡す。 さらに、-test.vを渡すと冗長出力も得られる。
exec プログラムで指定されたビルドされたバイナリを実行する。
remote 遠隔のヘッドレスDelveサーバに接続する。 リモートマシンでDelveを手動で実行し、リモートマシンを指す追加のremotePath、host、portデバッグ設定オプションを指定する必要がある。"request"はattachにする。
local ローカルマシンですでに動いているプロセスのデバッグを行う。"request"はattachにする。

debug, test, execモードはデバッガをきっかけに起動するため"request"タグはlaunchですが、remotelocalモードはすでに起動しているプロセスに対してデバッグをするためのモードなので"request"タグはattachに指定します。

詳細は下記の公式ドキュメントを参照
https://github.com/Microsoft/vscode-go/wiki/Debugging-Go-code-using-VS-Code

Goのユニットテストのコードをデバッグするには

下記リンクの別記事を作りました。

VSCodeでGoのユニットテストをデバッグしよう

参考

momotaro98
Gopher ʕ ◔ϖ◔ʔなWebエンジニアです。
https://momotaro98.github.io
rarejob
明治神宮にあるオンライン英会話サービスを提供するベンチャー
https://www.rarejob.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away