如何使用VisualStudioCode调试Go代码

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

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

有了这个技能集,您将能够更好地了解应用程序在代码执行中特定点的价值和状态。

先决条件

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

  • 对围棋的理解。 要了解更多信息,请查看我们的 如何在 Go 中编码。
  • 去安装在你的机器上。 要在您的机器上安装 Go,请按照教程为您的 Go 系列 操作系统设置本地编程环境。
  • Visual Studio Code 安装在你的机器上。
  • 已安装 VSCide-Go 插件

安装插件后,在 VS Code 中打开任何 .go 文件。 状态栏右下角会提示您安装分析工具。 单击该链接以安装必要的 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))
}

这里我们定义一个结构Avenger,然后创建一个复仇者数组,将其中一个的状态更改为"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 文件,我们可以将其更改为我们的工作区根目录:

启动.json

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

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

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

接下来,要么按 F5 或单击左上角 Debug Section 上带有绿色播放按钮的 Launch 按钮以打开 Debug View

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

调试器最终会移动到 Line 40

左边的 Debug Section 会给我们当前断点位置的状态。

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

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

您可以继续 Stepping Over,一旦我们越过这条线,您将看到 avengers 的值发生变化。 "Tony Stark"Alive

第三步——添加条件断点

VS Code 断点为您提供了一个选项来编辑断点,方法是给它们一个表达式,大部分时间通常是一个布尔表达式。

例如,在 第 40 行avengers[1].isAlive() 上,我们可以在此处添加一个条件,即仅当表达式计算为真时才引发断点,如 avengers[1].Planet == "Earth"

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

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

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

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

接下来,编辑代码以符合我们的预期。 将 Tony Stark 的星球更改为 Earth

main.go

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

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

第 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 插件,您将在测试功能的顶部看到其他选项 - run testdebug test

您可以点击 run test 运行测试,并在 Output 窗口中查看结果。

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

第 10 行 上添加断点:if res != c。 然后,点击调试测试

Debug View 再次打开,我们可以使用 Debug Tool 跨步检查左侧变量部分的状态。

结论

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

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