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

简介

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

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

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

前提条件

要完成本教程,您需要具备以下条件:

  • 了解围棋。要了解更多信息,请查看我们的如何在Go中编码]系列。
  • 在您的计算机上安装。要在您的计算机上安装Go,请按照教程从Go series.]为您的操作系统设置本地编程环境
  • 您的计算机上安装了Visual Studio
  • 安装了VSCide-Go plugin

一旦你安装了插件,在VS代码中打开任何.go文件。状态栏右下角会提示您安装分析工具 。点击该链接安装插件有效工作所需的GO包。

我们最终需要安装Delve,,Go的开源调试器。为此,请参阅针对特定platforms.的详细安装说明

第一步-创建示例应用

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

  • 生成JSON文件的Go程序。
  • 我们将编写函数、编写测试,并查看如何在VS代码中调试测试。

以下是第一个示例的源代码。创建文件main.go

1nano main.go

将以下内容添加到文件中:

 1[label main.go]
 2package main
 3
 4import (
 5    "encoding/json"
 6    "fmt"
 7    "log"
 8)
 9
10// Avenger represents a single hero
11type Avenger struct {
12    RealName string `json:"real_name"`
13    HeroName string `json:"hero_name"`
14    Planet string `json:"planet"`
15    Alive bool   `json:"alive"`
16}
17
18func (a *Avenger) isAlive() {
19    a.Alive = true
20}
21
22func main() {
23    avengers := []Avenger{
24    	{
25    		RealName: "Dr. Bruce Banner",
26    		HeroName: "Hulk",
27    		Planet:   "Midgard",
28    	},
29    	{
30    		RealName: "Tony Stark",
31    		HeroName: "Iron Man",
32    		Planet:   "Midgard",
33    	},
34    	{
35    		RealName: "Thor Odinson",
36    		HeroName: "Thor",
37    		Planet:   "Midgard",
38    	},
39    }
40
41    avengers[1].isAlive()
42
43    jsonBytes, err := json.Marshal(avengers)
44    if err != nil {
45    	log.Fatalln(err)
46    }
47    fmt.Println(string(jsonBytes))
48}

这里我们定义了一个结构Avenger,然后创建一个复仇者数组,将其中一个的状态更改为Alive‘,然后将结果转换为JSON,最后将其打印为STDOUT。

您可以使用以下命令运行该应用程序:

1go run main.go

它将产生以下输出:

1[secondary_label Output]
2[{"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}]

第二步-断点调试

要开始调试,我们需要创建一个配置。单击Visual Studio代码左窗格上的调试图标。接下来,单击Gear图标以创建配置。

调试和设置(齿轮)icons

.vscode/launch.json下创建一个配置文件,其内容如上所示。更改配置程序以指向main.go文件。在本例中,由于我们只有一个main.go文件,我们可以将其更改为工作区根目录:

 1[label launch.json]
 2{
 3  // ...
 4  "configuration": [
 5    {
 6      // ...
 7      "program": "${workspaceRoot}",
 8      // ...
 9    }
10  ]
11}

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

点击行号左侧,在第21行 (func main())上添加断点。在那里,您将看到一个红点。

22行左侧的红点

接下来,按F5或者在左上角的调试部分 点击带绿色播放按钮的启动按钮,打开** 调试视图** 。

Visual Studio代码调试视图

调试工具栏 上多次点击单步执行按钮。

调试工具栏跳过图标

调试器最终将移至第40行

调试器移至行40

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

显示断点state的调试部分

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

我们还可以看到调用堆栈,目前运行的函数是main函数,第40行

你可以继续走过去,你会看到‘复仇者’的价值变化,一旦我们超过了线。‘托尼·斯塔克’就是`活生生的‘。

调试视图显示Tony Stark仍为alive

第三步-添加条件断点

VS代码断点为您提供了编辑断点的选项,方法是为断点提供一个表达式,该表达式在大多数情况下通常是布尔表达式。

例如,在第40行Avengers[1].isAlive()上,我们可以在这里添加一个条件,即只有当表达式的计算结果为真时才会引发断点,如Avengers[1].Planet==Earth``。

为此,请在断点上单击鼠标右键并选择[编辑断点]。

![)

如果您没有断点,仍然可以右击,系统会提示您添加条件断点

![)

一旦我们选择了上面的任何一个,让我们添加条件:复仇者联盟[1].Planet==Earth``。

![添加条件‘复仇者联盟[1].Planet==)

现在用F5启动调试器,调试器不会停在断点处。应用程序运行正常,您可以在调试控制台 看到结果。

调试控制台结果

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

1[label main.go]
2// ...
3{
4    RealName: "Tony Stark",
5    HeroName: "Iron Man",
6    Planet:   "Earth",
7},
8// ...

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

调试视图,无JSON displayed

Step 4 -执行进一步的测试

让我们向文件中添加一个新函数,以启用加法运算:

1[label main.go]
2func add(a, b int) int{
3    return a+b
4}

在同一目录下创建测试文件main_test.go,内容如下:

 1[label main_test.go]
 2package main
 3
 4import "testing"
 5
 6func Test_add(t *testing.T) {
 7    a, b, c := 1, 2, 3
 8
 9    res := add(a, b)
10
11    if res != c {
12    	t.Fail()
13    }
14}

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

但是,如果您安装了VSCode-Go插件,您将在测试函数的顶部看到其他选项-运行测试 和** 调试测试** :

![)

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

然而,要调试测试,可能是因为我们找不到一些东西,我们所需要做的就是添加一个断点,就像我们以前做的那样,然后单击调试测试

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

在行10上添加断点

再次打开调试视图 ,我们可以使用** 调试工具** 在左侧的变量部分跳过并检查状态。

结论

调试是开发软件的关键部分,有了诸如Visual Studio Code之类的工具,我们的工作就轻松多了。

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

Published At
Categories with 技术
comments powered by Disqus