161
Help us understand the problem. What are the problem?

posted at

updated at

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

はじめに

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

前提条件

追記 2022年9月24日更新 動作確認済み

  • MacOS
    • OS version: 12.6 Monterey
    • Chip: Apple M1
  • Goをインストール済み
    • go version go1.19.1 darwin/arm64
  • $GOPATHを設定済み
  • $GOPATH/binを環境変数$PATHへ追加済み
  • VSCodeをインストール済み
    • Version: 1.71.0

設定内容

delveをインストール

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

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

$ xcode-select --install

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

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

delveをインストール

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

利用するXCodeのDeveloperモードをEnableにしない場合、デバッグを実行するたびに許可を求められることになります。ので、以下のコマンドで事前にEnableにしておきます。

sudo /usr/sbin/DevToolsSecurity -enable

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

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

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

Delve Debugger
Version: 1.9.1
Build: $Id: d81b9fd12bfa603f3cf7a4bc842398bd61c42940 $

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

VSCodeにて下記のGo言語用の拡張機能(以降vscode-goと表記)をインストールしていなければしましょう。

VSCodeの$GOPATHを確認

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

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

$ go env GOPATH

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

$GOPATHが想定したものでない場合

vscode-goではデフォルトでは$GOPTH$HOME/goです。

これを変更するにはVSCodeのユーザーまたはWorkSpace設定であるsettings.jsonにて下記の項目を修正する必要があります。

go.gopath => デフォルトを上書きする$GOPATHを記載する。

  "go.gopath": "/home/user/examplepath/go",

デバッグ

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

ブレークポイントを指定しデバッグ対象のファイルを開いた状態で下記スクショのようにデバッグタブから"Run and Debug"をクリックするとdlvが起動されデバッグが開始されます。

image.png

image.png

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

【追記 2021年6月6日時点】 遅くともvscode-goのバージョンv0.25.1ではLaunchした段階で自動的にlaunch.jsonは作成されず失敗時に選択で作成する仕様になっています。launch.jsonを作成せずに実行できている場合は下記の内容をデフォルト値として実行されています。

デバッグがエラーになる場合は指定ファイル(${fileDirname})としての開いているファイルを確認し変更するか、launch.jsonを修正する必要があります。

..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のユニットテストをデバッグしよう

参考

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
161
Help us understand the problem. What are the problem?