Fusic Tech Blog

Fusion of Society, IT and Culture

Visual Studio CodeとDelveでGo言語のアプリケーションをデバッグする
2020/04/07

Visual Studio CodeとDelveでGo言語のアプリケーションをデバッグする

こんにちは、岡嵜です。

弊社サービス mockmock ではmockの実装にGo言語を使っています。

今回、Go言語で実装されたプログラムをデバッグする機会があったので方法を調べたところ、予想以上に簡単にデバッグ環境を構築できたので手順を記事にまとめます。

今回やりたかったこと

プログラムを任意の場所で中断して、変数の値を参照したり、関数を実行したりしたい。

できたこと

Breakpointによるプログラムの中断・再開

ソースコードの特定行をダブルクリック、もしくは F9 を押すことでBreakpointを追加できます。 この状態でデバッガを起動しこの部分の処理が実行されると、Breakpointでプログラムが中断します。

Breakpointの追加

中断後、以下のような操作が可能です。

操作 説明 ショートカット
Step Over 1行実行する(関数の中に入らない) F10
Step Into 1行実行する(関数の中に入る) F11
Step Out 関数の中から呼び出し元へ戻る Shift+F11
Restart プログラムを再開する F5

変数の参照

Breakpointでプログラムが中断している状態で、サイドバーに変数の一覧が表示されます。

変数の参照

「WATCH」にはWatch式を追加することもできます。

できなかったこと

関数の実行

「DEBUG CONSOLE」に関数名を入れてみましたが、現状エラーとなるようです。

関数の実行

以下のISSUEで目下対応中のようなので、今後に期待ですね。

https://github.com/microsoft/vscode-go/issues/2655

デバッグ環境の構築

前提

  • macOSにVS Codeがインストールされている
  • go1.14.1以降がインストールされている

delveのインストール

デバッグには delve というデバッガを使用しました。

go get github.com/go-delve/delve/cmd/dlv
sudo /usr/sbin/DevToolsSecurity -enable

macOS以外のOSをお使いの方は こちら のページを参照してインストールしてください。

VS CodeにGoのExtensionをインストール

VS CodeのExtensionsタブを開き、GoのExtensionをインストールします。

VS CodeにGoのExtensionをインストール

以上で準備完了です。

デバッグ手順

デバッグ対象のアプリケーションを取得

今回、デバッグ対象のアプリケーションとして以下を使わせていただきました。

https://github.com/pangpanglabs/echosample

以下コマンドを実行し、アプリケーションを取得・起動します。

git clone git@github.com:pangpanglabs/echosample.git
cd echosample
go mod init github.com/pangpanglabs/echosample # go moduleをONにしている場合のみ実行
go mod vendor # go moduleをONにしている場合のみ実行
go run main.go

http://localhost:8080/ へアクセスすると、アプリケーションが表示できます。

デバッガの起動

以下手順でデバッガを起動します。

  1. VS Codeを起動し、 echosample/main.go を開きます
  2. キーボードの F5 を押します
  3. (初回のみ)「Run and Debug 」をクリックします

デバッガの起動

注意: デバッガを起動するときは必ず main.go を開いていることを確認するようにしてください

所感

普段はRuby on Railsを使った開発をしておりデバッグ時は binding.pry を使っていたので、Go言語でも同様の方法を想定していました。

pry だとソースコードの編集が必要ですし、ステップ実行が難しいという問題もありましたが、VS Code+delvenによるデバッグはその点が解消できています。

1点だけ不満を挙げるとするならば、Hot Reloadに対応するのが難しい点です。これは、「 Cmd+F5F5」を押してデバッガを再起動すればそこまで非効率ではないので、あまり苦ではないと思っています。

あとはプログラム中断時の関数呼び出しに対応するのを待つのみですね。

yuuu

yuuu

2018年の年明けに組込み畑からやってきた、2児の父 兼 Webエンジニアです。 mockmockの開発・運用を担当しており、組込みエンジニア時代の経験を活かしてデバイスをプログラミングしたり、簡易的なIoTシステムを作ったりしています。主な開発言語はRuby、時々Go。