VisualStudioCodeを使用してGoコードをデバッグする方法
序章
このチュートリアルでは、GoコードをVisualStudioCodeでデバッグするために必要な手順について説明します。 拡張機能、分析ツール、およびデバッガーのインストールが必要になります。
まず、サンプルアプリケーションを作成します。 次に、ブレークポイントと条件付きブレークポイントの使用について説明します。
このスキルセットを使用すると、コード実行の特定の時点でのアプリケーションの価値と状態をよりよく理解できるようになります。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- 囲碁の理解。 詳細については、Goシリーズのコーディング方法をご覧ください。
- マシンにインストールしてください。 マシンにGoをインストールするには、チュートリアルに従って、Goシリーズからオペレーティングシステムのローカルプログラミング環境をセットアップします。
- Visual StudioCodeがマシンにインストールされています。
- VSCide-Goプラグインがインストールされています。
プラグインをインストールしたら、VSCodeで.goファイルを開きます。 ステータスバーの右下に、分析ツールのインストールの入力を求めるメッセージが表示されます。 そのリンクをクリックして、プラグインが効率的に機能するために必要なGoパッケージをインストールします。
最後に、Go用のオープンソースデバッガーであるDelveをインストールする必要があります。 これを行うには、特定のプラットフォーム用の詳細なインストール手順があります。
ステップ1—サンプルアプリを作成する
Goコードをデバッグするために2つの例を使用します。
- JSONファイルを生成するGoプログラム。
- 関数を記述し、テストを記述し、VSCodeでテストをデバッグする方法を確認します。
これが最初の例のソースコードです。 ファイルを作成しますmain.go:
nano main.go
次のコンテンツをファイルに追加します。
main.go
package main
import (
"encoding/json"
"fmt"
"log"
)
// Avenger represents a single hero
type Avenger struct {
RealName string `json:"real_name"`
HeroName string `json:"hero_name"`
Planet string `json:"planet"`
Alive bool `json:"alive"`
}
func (a *Avenger) isAlive() {
a.Alive = true
}
func main() {
avengers := []Avenger{
{
RealName: "Dr. Bruce Banner",
HeroName: "Hulk",
Planet: "Midgard",
},
{
RealName: "Tony Stark",
HeroName: "Iron Man",
Planet: "Midgard",
},
{
RealName: "Thor Odinson",
HeroName: "Thor",
Planet: "Midgard",
},
}
avengers[1].isAlive()
jsonBytes, err := json.Marshal(avengers)
if err != nil {
log.Fatalln(err)
}
fmt.Println(string(jsonBytes))
}
ここでは、構造体Avengerを定義し、アベンジャーズの配列を作成し、そのうちの1つのステータスを"alive"に変更し、結果をJSONに変換して、最後にSTDOUTに出力します。
次のコマンドでアプリを実行できます。
go run main.go
次の出力が生成されます。
Output[{"real_name":"Dr. Bruce Banner","hero_name":"Hulk","planet":"Midgard","alive":false},{"real_name":"Tony Stark","hero_name":"Iron Man","planet":"Midgard","alive":true},{"real_name":"Thor Odinson","hero_name":"Thor","planet":"Midgard","alive":false}]
ステップ2—ブレークポイントを使用したデバッグ
デバッグを開始するには、構成を作成する必要があります。 VisualStudioCodeの左側のペインにあるデバッグアイコンをクリックします。 次に、ギアアイコンをクリックして構成を作成します。
.vscode/launch.jsonの下に、上記の内容の設定ファイルが作成されます。 main.goファイルを指すように構成プログラムを変更します。 この例では、main.goファイルしかないため、ワークスペースルートに変更できます。
launch.json
{
// ...
"configuration": [
{
// ...
"program": "${workspaceRoot}",
// ...
}
]
}
次に、ブレークポイントを追加する必要があります。これがデバッグの目的だからです。
行番号の左側をクリックして、 Line 21 (func main())にブレークポイントを追加しましょう。 そこに、赤い点が表示されます。
次に、F5を押すか、左上のデバッグセクションにある緑色の再生ボタンが付いた[起動]ボタンをクリックして、デバッグビューを開きます。
デバッグツールバーのStep Overボタンを複数回クリックします。
デバッガーは最終的にLine40に移動します。
左側のデバッグセクションは、現在のブレークポイント位置の状態を示します。
Variables セクションで、その特定の時点での変数の状態または値を確認できます。
コールスタックも確認できます。現時点では、実行中の関数はmain関数、および Line40です。
ステップオーバーを続行できます。ラインを超えると、avengersの値が変化するのがわかります。 "Tony Stark"はAliveです。
ステップ3—条件付きブレークポイントを追加する
VS Codeブレークポイントには、ブレークポイントに式を指定して編集するオプションがあります。ほとんどの場合、これはブール式です。
たとえば、 Line 40 、avengers[1].isAlive()では、avengers[1].Planet == "Earth"のように、式がtrueと評価された場合にのみブレークポイントが発生するという条件をここに追加できます。
これを行うには、ブレークポイントを右クリックして、ブレークポイントの編集を選択します。
ブレークポイントがない場合でも右クリックすると、条件付きブレークポイントの追加が表示されます。
上記のいずれかを選択したら、条件を追加しましょう:avengers[1].Planet == "Earth"。
これで、F5を使用してデバッガーを起動しても、ブレークポイントで停止しません。 アプリは正常に実行され、デバッグコンソールに結果が表示されます。
次に、期待どおりにコードを編集します。 トニースタークの惑星をEarthに変更します。
main.go
// ...
{
RealName: "Tony Stark",
HeroName: "Iron Man",
Planet: "Earth",
},
// ...
F5でデバッガを再起動すると、デバッグビューが開き、ブレークポイントで実行が停止します。 デバッグコンソールにJSONが表示されていないことがわかります。
ステップ4—さらにデバッグテストを実行する
ファイルに新しい関数を追加して、加算演算を有効にしましょう。
main.go
func add(a, b int) int{
return a+b
}
同じディレクトリに次の内容のテストファイルmain_test.goを作成します。
main_test.go
package main
import "testing"
func Test_add(t *testing.T) {
a, b, c := 1, 2, 3
res := add(a, b)
if res != c {
t.Fail()
}
}
コードは2つの数値を追加するだけで、テストは関数を呼び出すだけです。
ただし、VSCode-Goプラグインがインストールされている場合は、テスト関数の上部に追加のオプションが表示されます- runtestおよびdebugtest:
run test をクリックしてテストを実行し、Outputウィンドウで結果を確認できます。
ただし、テストをデバッグするには、何かがわからないためか、前と同じようにブレークポイントを追加して、デバッグテストをクリックするだけです。
10行目にブレークポイントを追加します:if res != c。 次に、デバッグテストをクリックします。
デバッグビューが再び開き、デバッグツールを使用して、左側の変数セクションの状態を確認できます。
結論
デバッグはソフトウェア開発の重要な部分であり、Visual Studio Codeなどのツールを使用すると、私たちの生活をはるかに簡単にすることができます。
概念を説明するためにサンプルプロジェクトにデバッガーを追加しましたが、既存のプロジェクトのいずれかにデバッガーを追加して、試してみてください。 最終的には、ログに使用されるfmt.Printlnステートメントを減らして、実行中の特定の時点でのコードの値または状態を確認します。