miyazi888の覚え書き日記

学習したことを書き留めてます。

VS CodeでのGo言語のデバック

以下の場合にどうやってデバッカーを起動するのか、少し迷ってしまったので、その防備録。

  • エントリポイントが./main.go以外の時
  • テストコードをデバック

エントリポイントが./main.go以外の時のデバック

./main.goにエントリポイントがある場合は素直にブレイクポイントを設定後、デバッカを起動することで問題なくデバックできる。もしAPIサーバとかの場合はデバッカ起動後にcurlなどでHTTPリクエストを送信する。

ところが、./main.go以外にある時、どうやってデバックできるのかわからなかった。

結論としてはデバッカ起動の設定ファイルである所のlaunch.jsonのprogramの部分に起動したいエントリポイントを記述することで解決する。 例えば、エントリポイントが./api/main.goの場合は以下のように設定する。

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch Package",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceRoot}/api"
        }
    ]
}

テストコードのデバック

テストコードをデバックしたい時にもどうすれば良いのかわからなかったので調べた。

こちらはやはり、launch.jsonを下記のように設定することでデバックできた。

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch unit test",
            "type": "go",
            "request": "launch",
            "mode": "test",
            "program": "${workspaceRoot}/${relativeFileDirname}",
            "args": [
                "-test.run",
                "TestFunc1"
            ],
            "showLog": true, 
        }
    ]
}

programにrelativeFileDirnameを指定することで今現在、VSCodeで開いているファイル(この場合は単体テストコードのファイル)を対象にデバックを実行しようとする。

さらにargsで実行するテスト関数をTestFunc1に限定している。

おわりに

ちなみにlaunch.json内のconfigurationsは配列で、複数の設定を記述することができる。
自分自身はアプリ用の設定とテストコード用の設定を設定して状況に応じて切り替えている。

画面左にサイドバーにデバックビューを表示していれば、上の方にlaunch.jsonで設定した名前の一覧が表示されるハズなので、そこで切り替えできるハズ。