序章

このチュートリアルでは、GoコードをVisualStudioCodeでデバッグするために必要な手順について説明します。 拡張機能、分析ツール、およびデバッガーのインストールが必要になります。

まず、サンプルアプリケーションを作成します。 次に、ブレークポイントと条件付きブレークポイントの使用について説明します。

このスキルセットを使用すると、コード実行の特定の時点でのアプリケーションの価値と状態をよりよく理解できるようになります。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • 囲碁の理解。 詳細については、Goシリーズのコーディング方法をご覧ください。
  • マシンにインストールしてください。 マシンにGoをインストールするには、チュートリアルに従って、Goシリーズからオペレーティングシステムのローカルプログラミング環境をセットアップします。
  • Visual StudioCodeがマシンにインストールされています。
  • VSCide-Goプラグインがインストールされています。

プラグインをインストールしたら、VSCodeで.goファイルを開きます。 ステータスバーの右下に、分析ツールのインストールの入力を求めるメッセージが表示されます。 そのリンクをクリックして、プラグインが効率的に機能するために必要なGoパッケージをインストールします。

最後に、Go用のオープンソースデバッガーであるDelveをインストールする必要があります。 これを行うには、特定のプラットフォーム用の詳細なインストール手順があります。

ステップ1—サンプルアプリを作成する

Goコードをデバッグするために2つの例を使用します。

  • JSONファイルを生成するGoプログラム。
  • 関数を記述し、テストを記述し、VSCodeでテストをデバッグする方法を確認します。

これが最初の例のソースコードです。 ファイルを作成しますmain.go

  1. 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に出力します。

次のコマンドでアプリを実行できます。

  1. 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の左側のペインにあるデバッグアイコンをクリックします。 次に、歯車アイコンをクリックして構成を作成します。

Debug and Settings (Gear) icons

.vscode/launch.jsonの下に、上記の内容の構成ファイルが作成されます。 main.goファイルを指すように構成プログラムを変更します。 この例では、main.goファイルしかないため、ワークスペースルートに変更できます。

launch.json
{
  // ...
  "configuration": [
    {
      // ...
      "program": "${workspaceRoot}",
      // ...
    }
  ]
}

次に、ブレークポイントを追加する必要があります。これがデバッグの目的だからです。

行番号の左側をクリックして、 Line 21 func main())にブレークポイントを追加しましょう。 そこに、赤い点が表示されます。

Red dot to the left of Line 22

次に、F5を押すか、左上のデバッグセクションにある緑色の再生ボタンが付いた[起動]ボタンをクリックして、デバッグビューを開きます。

Visual Studio Code Debug View

デバッグツールバーStep Overボタンを複数回クリックします。

Step Over icon in Debug Toolbar

デバッガーは最終的にLine40に移動します。

Debugger moved to line 40

左側のデバッグセクションは、現在のブレークポイント位置の状態を示します。

Debug section showing breakpoint state

Variables セクションで、その特定の時点での変数の状態または値を確認できます。

コールスタックも確認できます。現時点では、実行中の関数はmain関数、および Line40です。

ステップオーバーを続行できます。ラインを超えると、avengersの値が変化するのがわかります。 "Tony Stark"Aliveです。

Debug view showing Tony Stark is still alive

ステップ3—条件付きブレークポイントを追加する

VS Codeブレークポイントには、ブレークポイントに式を指定して編集するオプションがあります。ほとんどの場合、これはブール式です。

たとえば、 Line 40 avengers[1].isAlive()では、avengers[1].Planet == "Earth"のように、式がtrueと評価された場合にのみブレークポイントが発生するという条件をここに追加できます。

これを行うには、ブレークポイントを右クリックして、ブレークポイントの編集を選択します。

"Edit breakpoint…" menu option

ブレークポイントがない場合でも右クリックすると、条件付きブレークポイントの追加が表示されます。

"Add Conditional Breakpoint…" menu option

上記のいずれかを選択したら、条件を追加しましょう:avengers[1].Planet == "Earth"

Adding condition 'avengers[1].Planet == "Earth"'

これで、F5を使用してデバッガーを起動しても、ブレークポイントで停止しません。 アプリは正常に実行され、デバッグコンソールに結果が表示されます。

Debug console results

次に、期待するものと一致するようにコードを編集します。 トニースタークの惑星をEarthに変更します。

main.go
// ...
{
	RealName: "Tony Stark",
	HeroName: "Iron Man",
	Planet:   "Earth",
},
// ...

F5でデバッガを再起動すると、デバッグビューが開き、ブレークポイントで実行が停止します。 デバッグコンソールにJSONが表示されていないことがわかります。

Debug View, no JSON displayed

ステップ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" and "debug test" options

run test をクリックしてテストを実行し、Outputウィンドウで結果を確認できます。

ただし、テストをデバッグするには、何かがわからないためか、以前と同じようにブレークポイントを追加して、デバッグテストをクリックするだけです。

10行目にブレークポイントを追加します:if res != c。 次に、デバッグテストをクリックします。

Adding breakpoint on Line 10

デバッグビューが再び開き、デバッグツールを使用して、左側の変数セクションの状態を確認できます。

結論

デバッグはソフトウェア開発の重要な部分であり、Visual Studio Codeなどのツールを使用すると、私たちの生活をはるかに簡単にすることができます。

概念を説明するためにサンプルプロジェクトにデバッガーを追加しましたが、既存のプロジェクトのいずれかにデバッガーを追加して、試してみてください。 最終的には、ログに使用されるfmt.Printlnステートメントを減らして、実行中の特定の時点でのコードの値または状態を確認します。