如何使用 Visual Studio Code 调试 Go 代码

介绍

本教程将讨论使用Visual Studio Code调试Go代码所需的步骤它将需要安装扩展、分析工具和调试器。

首先,我们将创建一个示例应用程序。然后,我们将探索使用断点和条件断点。

使用此技能组合,您将能够更好地了解应用程序在代码执行中特定点的价值和状态。

先决条件

要完成本教程,您将需要以下内容:

安装插件后,.go在 VS Code 中打开任何文件。状态栏右下角将提示您安装分析工具单击该链接以安装必要的 Go 包,以使插件高效工作。

我们最终需要安装Delve,一个 Go 的开源调试器。为此,有针对特定平台的详细安装说明

第 1 步 – 创建示例应用程序

我们将使用两个示例来调试我们的 Go 代码:

  • 生成 JSON 文件的 Go 程序。
  • 我们将编写一个函数,编写测试,然后看看我们如何在 VS Code 中调试测试。

这是第一个示例的源代码。创建一个文件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))
}

这里我们定义了一个 struct Avenger,然后创建了一个 Avengers 数组,将其中一个的状态更改为"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 步 – 使用断点调试

要开始调试,我们需要创建一个配置。单击 Visual Studio Code 左窗格中的调试图标。接下来,单击齿轮图标以创建配置。

调试和设置(齿轮)图标

.vscode/launch.json上面显示的内容下创建了一个配置文件更改配置程序以指向该main.go文件。在这种情况下,由于我们只有一个main.go文件,我们可以将其更改为我们的工作区根目录:

启动文件
{
  // ...
  "configuration": [
    {
      // ...
      "program": "${workspaceRoot}",
      // ...
    }
  ]
}

接下来我们需要添加一个断点,因为这就是调试的全部内容。

让我们通过单击行号左侧的方式第 21 行( func main())上添加一个断点在那里,您会看到一个红点。

第 22 行左侧的红点

接下来,按下F5或单击左上角调试部分带有绿色播放按钮的启动按钮以打开调试视图

Visual Studio 代码调试视图

多次单击调试工具栏上的Step Over按钮

调试工具栏中的“跳过”图标

调试器最终将移至第 40 行

调试器移至第 40 行

左侧调试部分将为我们提供当前断点位置的状态。

显示断点状态的调试部分

我们可以在Variables部分查看特定时间变量的状态或值

我们还可以看到调用堆栈,此时正在运行的函数是main函数,以及第 40 行

您可以继续 Stepping Over,avengers一旦我们越线,您将看到更改的值"Tony Stark"Alive

调试视图显示托尼·斯塔克还活着

第 3 步 – 添加条件断点

VS Code 断点为您提供了一个选项来编辑断点,方法是给它们一个表达式,大多数情况下通常是一个布尔表达式。

例如,在第40行avengers[1].isAlive()我们可以在这里添加一个条件断点才升起时,表达式的值为true,如avengers[1].Planet == "Earth"

为此,请右键单击断点并选择Edit Breakpoint

“编辑断点...”菜单选项

如果您没有断点,您仍然可以右键单击,您将被告知添加条件断点

“添加条件断点...”菜单选项

让我们添加的条件,一旦我们选择上述任何的:avengers[1].Planet == "Earth"

添加条件 'avengers[1].Planet == "Earth"'

现在,如果您使用 启动调试器F5,它将不会在断点处停止。该应用程序将运行良好,您将在Debug Console 中看到结果

调试控制台结果

接下来,编辑代码以符合我们的预期。将托尼·斯塔克的星球改为Earth

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

当我们再次使用 启动调试器时F5调试视图打开并且执行在断点处停止。我们可以看到 JSON 没有显示在Debug Console 中

调试视图,未显示 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()
    }
}

代码只是将两个数字相加,测试只是调用了函数。

但是,如果您安装了 VSCode-Go 插件,您将在测试功能的顶部看到其他选项 –运行测试调试测试

“运行测试”和“调试测试”选项

您可以单击运行测试来运行测试并在输出窗口中查看结果

然而,为了调试测试,也许是因为我们无法弄清楚某些事情,我们需要做的就是像之前一样添加一个断点,然后单击debug test

添加一个断点第10行if res != c然后,单击调试测试

在第 10 行添加断点

调试视图再次被打开,我们可以使用调试工具来跨越和检查上左边的变量部分的状态。

结论

调试是开发软件的关键部分,借助 Visual Studio Code 等工具,我们的生活变得更加轻松。

我们已将调试器添加到示例项目中以解释概念,但您可以随意将调试器添加到任何现有项目中并使用它。您最终将减少fmt.Println用于记录语句,以查看代码在执行期间给定点的值或状态。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁