goland 自动切换对应 dlv 版本调试程序,同时调试不同 go 版本的项目再也不用担心版本问题

19 天前
 body007

公司项目用的可能不是最新 go 版本,而我自己折腾一般都是最新版本。但是 goland 没有找到根据不同项目自动切换 dlv 版本的方法。网上都是让 goland 编辑自定义属性 的 bin\idea.properties 文件添加 dlv.path=/xxx ,但这貌似是 goland 的全局配置,也就是所有项目在调试时都使用相同的 dlv 程序。

因此我编写如下代码,用来替换 goland 默认使用的 dlv 程序。该代码会自动识别调试的可执行程序编译的 go 版本,并执行对应 go 版本的 dlv 程序。

只需要在如下路径按照 go 大版本命名存放对应版本 dlv 程序即可。

$GOPATH/bin/dlv.go1.23.exe
$GOPATH/bin/dlv.go1.22.exe
$GOPATH/bin/dlv.go1.21.exe

goland 使用的 dlv 文件就用下面代码编译的可执行程序替换即可。

package main

import (
	"debug/buildinfo"
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
)

func main() {
	var file string
	for i, v := range os.Args {
		if v == "exec" {
			file = os.Args[i+1]
			break
		}
	}
	info, err := buildinfo.ReadFile(file)
	if err != nil {
		panic(err)
	}
	vs := strings.Split(info.GoVersion, ".")

	cmd := exec.Command(
		// install dlv: $GOPATH/bin/dlv.go1.23.exe
		filepath.Join(os.Getenv("GOPATH"), "bin",
			fmt.Sprintf("dlv.%s.%s.exe", vs[0], vs[1])),
		os.Args[1:]...,
	)
	cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr

	if err = cmd.Run(); err != nil {
		panic(err)
	}
}
1181 次点击
所在节点    Go 编程语言
5 条回复
bv
19 天前
用最新版的 dlv 就行吧,高版本的 dlv 应该是兼容低版本 go 程序调试吧?
body007
18 天前
@bv 要是能兼容我也不会想这办法了,网上搜到的都是 goland 新版自带 dlv 调试自己的项目有问题额。
yyzq007
18 天前
感谢分享
Nazz
18 天前
go install delve@latest 然后替换掉 goland 目录下的 dlv 就行了
vimiix
16 天前
和 golang 的 dl 原理一样。
https://github.com/golang/dl/blob/304e16060ce9dd939a4a94fd0add52bdd003b0dd/internal/version/version.go#L57

我是自己写个 shell 脚本,可以快速下载任意版本,再搭配 autoenv 可以实现不同项目自动切换 go 版本
https://gist.github.com/vimiix/0927fdfbea926e869a2c631db9eeae8b

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1069120

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX