如何使用VS Code调试Go代码

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

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

凭借这套技能,您将能够更好地理解应用程序在代码执行的特定点上的值和状态。

先决条件

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

已在您的机器上安装 Go。要在您的机器上安装 Go,请参照 Go 系列中的教程为您的操作系统设置本地编程环境
您的机器上安装了 VS Code, 请参考VSCode 安装和配置指南进行安装与配置 。

已安装 VSCode -Go 插件。

安装插件后,在 VS Code 中打开任意.go 文件。状态栏右下角会提示您安装分析工具。单击该链接安装插件有效运行所需的 Go 包。

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

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

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

生成 JSON 文件的 Go 程序。
我们将编写一个函数,编写测试,并了解如何在 VS Code 中调试测试。
这是第一个例子的源代码。创建一个文件 main.go:

1
nano main.go

在文件中添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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。

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

1
2
3

go run main.go

它将产生以下输出:

1
2
3
4

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 步 - 使用断点进行调试

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

调试和设置图标

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch golang program",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "main.go"
}
]
}

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

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

Visual Studio Code 设置断点

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

Visual Studio Code 调试视图

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

调试工具栏中的“Step Over”图标

调试器最终将移动到第 40 行。

调试器移至第 40 行

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

显示断点状态的调试部分

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

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

avengers您可以继续“跨过”,一旦我们越过该线,您就会看到变化的值。”Tony Stark”是Alive。

调试视图显示 Tony Stark 仍然活着

第 3 步 - 添加条件断点

VS Code 断点为您提供了通过赋予表达式来编辑断点的选项,该表达式大多数时候通常是一个布尔表达式。

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

为此,右键单击断点并选择编辑断点。

编辑断点

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

添加条件断点

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

添加条件

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

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

1
2
3
4
5
6
7
// ...
{
RealName: "Tony Stark",
HeroName: "Iron Man",
Planet: "Earth",
},
// ...

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

第 4 步 - 执行step into的调试

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

1
2
3
func add(a, b int) int{
return a+b
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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 插件,你会在测试函数顶部看到其他选项 -运行测试和调试测试:

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

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

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

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

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

结论

调试是软件开发的重要部分,借助 VS Code 等工具,我们的生活可以变得更加轻松。

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

参考文档

How To Debug Go Code with Visual Studio Code

作者

鹏叔

发布于

2024-07-04

更新于

2024-08-31

许可协议

评论