讲解配置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
例子
代码目录结构
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
二进制调试
生成二进制文件
go build -o __go_build_stu_go -gcflags all='-N -l' dlv_stu.go
调试命令
dlv exec __go_build_stu_go
调试常用命令
-
break 或 b
增加断点
如在dlv_stu.go的第15行加断点:break dlv_stu.go:14
增加断点是可以命名:b my dlv_stu.go:15 -
breakpoints
列出所有断点
-
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