vscode配置Go调试环境一键调试,解决标准输入问题

5,148 阅读2分钟

讲解配置vscode,一键调试Go代码,重点解决dlv调试时无法标准输入的问题。vscode一键调试配置在请点击目录跳转

vscode go语言一键调试配置

方式1

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch File",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${file}",
            "console": "integratedTerminal",
        },
    ]
}

方式2

此方式为后台运行task的方式
launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "debug go",
            "type": "go",
            "request": "launch",
            "mode": "debug",
            "program": "${file}",
            "debugServer":54321,
            "preLaunchTask": "dlv-debug",
        },
    ]
}

tasks.json

{
    "tasks": [
        {
            "label": "dlv-debug",
            "type": "process",
            "command": "dlv",
            "args": [
                "dap",
                "--check-go-version=false",
                "--listen=127.0.0.1:54321",
            ],
            "isBackground": true,
            "problemMatcher": [
                {
                    "pattern": [
                        {
                            "regexp": ".",
                            "file": 1,
                            "location": 2,
                            "message": 3
                        }
                    ],
                    "background": {
                        "activeOnStart": true,
                        "beginsPattern": ".",
                        "endsPattern": ".",
                    }
                }
            ],
        },
    ]
}

完成以上配置后,切换到需要调试的文件,F5一键调试,输入在名为dlv-debug的终端中进行即可。 以上解决了标准输入的问题以及每次需要手动启动dlv dap的问题。

Delve讲解

Delve是一个 Go 语言的调试器,其目标是为 Go 提供一个简单、功能齐全的调试工具。 提供的命令行工具dlv类似于gdb,十分方便。同时也支持远程代码调试。

dlv基本使用

命令行调用dlv类似于gdb的使用。dlv可以调试代码同时可以调试二进制文件。

代码调试

使用debug子命令:如果位于与主包相同的目录中,则可以在没有参数的情况下进行调试,否则它可以选择接受一个包路径。

dlv debug 

指定路径:

dlv debug github.com/me/foo/cmd/foo -- -arg1 value

例子

代码目录结构

Screenshot_20220425_194723.png

go.mod

module dlv_stu

go 1.18

dlv_stu.go

package main

import (
    "fmt"
    "io"
)

type Node struct {
    dis int
    vis bool
    neibor map[*Node]int
}

func main() {
    var n int
    fmt.Scan(&n)

    tree := make([]*Node, n+1)

    sum := 0
......

调试命令

dlv debug
或
dlv debug main.go

Screenshot_20220425_195630_ma.png

二进制调试

生成二进制文件

go build -o __go_build_stu_go -gcflags all='-N -l' dlv_stu.go

调试命令

dlv exec __go_build_stu_go

Screenshot_20220425_200627_ma.png

调试常用命令

  • break 或 b
    增加断点
    如在dlv_stu.go的第15行加断点:break dlv_stu.go:14
    增加断点是可以命名:b my dlv_stu.go:15

  • breakpoints
    列出所有断点

Screenshot_20220425_201748.png

  • clear
    清除指定断点,根据breakpoints列出的断点名称
    clear 1

  • clearall
    清除所有断点

  • condition

  • on

  • watch

  • continue
    继续运行,直到下一个断点

  • next
    运行至下一行代码,不会进入函数内部

  • step
    步进,会进入函数内部

  • restart
    重新运行

  • stepout
    跳出当前函数

  • print
    打印一个表达式的值

  • set

  • display

  • ......

存在问题

当前这样调试,无法处理输入输出,如代码中的fmt.Scan(&n) ,程序会阻塞在这里。

命令行解决办法

在命令行下添加重定向命令参数-r:stdin:input.txt,先将输入写入相应文件中,再进行调试。

dlv debug -r stdin:input.txt dlv_stu.go

vscode解决办法,见“vscode go语言一键调试配置”