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
ステートメントを減らして、実行中の特定の時点でのコードの値または状態を確認します。