vscode使用delve调试golang程序

环境配置

delve仓库,含有教程:https://github.com/go-delve/delve

golang的debugging教程:https://github.com/golang/vscode-go/wiki/debugging

bash 复制代码
> go version
go version go1.20 windows/amd64

> go install github.com/go-delve/delve/cmd/dlv@latest

快捷键

bash 复制代码
F8 下一步

F7 进入函数
Shift+F8 退出函数

F9 下一个断点

golang的调试有三种模式

1、Launch package

json 复制代码
// Launch package: Debug/test the package of the open file 
{
    "name": "Launch Package",
    "type": "go",
    "request": "launch",
    "mode": "auto",
    "args": ["new", " conda"],
    "program": "${fileDirname}"
}

从说明上看出这是调试当前打开的文件所在的包,所以当前打开的文件需要是main包,里面有main函数,或者是测试文件,也就是需要可直接运行的文件。类比于我们直接进入该目录执行go run

可以带上运行参数 args

测试程序

bas 复制代码
ctl/
	ctl.go
go 复制代码
package main

import (
	"fmt"
	"voteapi/ctl/cmd"
)

func main() {
	fmt.Println("xxx")
	cmd.Execute()
}

fmt.Println("xxx")打上断点,因为调试器会直接跳到第一个断点的地方,如果一个断点都没有那就直接结束了。

控制台输出

bash 复制代码
Starting: D:\dev\php\magook\trunk\server\golang\path\bin\dlv.exe dap --listen=127.0.0.1:20155 from D:\dev\php\magook\trunk\server\voteapi\ctl
DAP server listening at: 127.0.0.1:20155
Type 'dlv help' for list of commands.

mode参数的值

  • debug: build and debug a main package
  • test: build and debug a test
  • exec: debug a precompiled binary
    • The binary must be built with go build -gcflags=all="-N -l" to disable inlining and optimizations that can interfere with debugging.
  • auto: automatically choose between debug and test depending on the open file

2、Attach to process

json 复制代码
// Attach to local process: Attach to an existing process by process ID
{
    "name": "Attach to Process",
    "type": "go",
    "request": "attach",
    "mode": "local",
    "processId": 0
}

attach: You can use this configuration to attach to a running process or a running debug session.

mode参数的值

  • local: attaches to a local process.
    • The binary must be built with go build -gcflags=all="-N -l" to disable inlining and optimizations that can interfere with debugging.
  • remote: attaches to an in-progress debug session run by an external server.

You can debug an already running program using the local mode type configuration. The Go extension will start dlv dap and configure it to attach to the specified process. Users can select the process to debug with one of the following options:

  • Specifying the numeric process id (PID) with the processId attribute.
  • Specifying the target program name in the processId attribute. If there are multiple processes matching the specified program name, the extension will show the list of matching processes at the start of the debug session.
  • Specifying 0 in the processId attribute and selecting the process from the drop-down menu at the start of the debug session.

attach 的 local 模式的应用场景是常驻内存的程序,比如 http server,我们编译运行程序后,来到VScode,主要配置 processId 属性,可以是进程ID,可以是进程名称,也可以给0,然后编辑器会弹出下拉框让你选择要attach上的程序。

示例,还是 ctl.go 文件,改一下

go 复制代码
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "%s", "hello")
	})
	http.ListenAndServe(":9999", nil)
}
bash 复制代码
go build ctl.go
ctl.exe

我们选择Attach to Process,点击运行调试三角形按钮,在弹出的下拉框输入ctl.exe,启动调试,同样的要先打几个断点。

此时调试工具栏是这样的

是出于暂停状态的,我们在浏览器请求一下这个服务,它就被激活了,就可以逐步调试了。

一个请求被调试完之后,调试不会结束,而是暂停了,等待下一个请求来触发。

3、Connect to server

说明 https://github.com/golang/vscode-go/wiki/debugging#remote-debugging

这是 vscode 的 Remote debugging 功能,他是基于 Remote Development,即远程开发,远程调试,这还需要安装额外的vscode扩展,将远程代码映射到本地,然后本地代码能时时推送到远程服务器,最终在远程服务器上运行代码。

我是直接在本地来的,发现也可以调试。

go 复制代码
package main

import (
	"fmt"
	"voteapi/ctl/cmd"
)

func main() {
	fmt.Println("xxx")
	cmd.Execute()
}
json 复制代码
// Connect to server: Connect to a remote headless debug server
{
    "name": "Connect to server",
    "type": "go",
    "debugAdapter": "dlv-dap",
    "request": "attach",
    "mode": "remote",
    "remotePath": "${workspaceFolder}",
    "port": 2345,
    "host": "127.0.0.1"
}
bash 复制代码
dlv debug --headless --listen=:2345

launch.json配置项

文档 https://github.com/golang/vscode-go/wiki/debugging#configuration

json 复制代码
// 命令行参数,要自己打空格
"args": ["-config", " server.json"],

// 编译参数
"buildFlags": "-tags 'server'",

// key:value
"env": {},
相关推荐
apocelipes4 小时前
下划线字段在golang结构体中的应用
golang
骑着毛驴数星星7 小时前
CANDB++中的CAN_DBC快速编辑方法,使用文本编辑器(如notepad++和VScode)
vscode·can
Python私教15 小时前
从“Hello World”到“高并发中间件”:Go 语言 2025 系统学习路线图
学习·中间件·golang
weixin_3077791316 小时前
VS Code配置MinGW64编译Ipopt库
开发语言·c++·vscode·算法
weixin_3077791318 小时前
VS Code配置MinGW64编译backward库
开发语言·c++·vscode·算法
QL.ql1 天前
vscode的ws环境,esp32s3连接wifi
ide·vscode·编辑器
光爷不秃1 天前
Go语言中安全停止Goroutine的三种方法及设计哲学
开发语言·安全·golang
Hyvial2 天前
VsCode 使用指南(配置 + 美化)
vscode
十秒耿直拆包选手2 天前
IDE:vscode的vue3模板
javascript·ide·vscode