公司项目用的可能不是最新 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)
}
}
1
bv 114 天前
用最新版的 dlv 就行吧,高版本的 dlv 应该是兼容低版本 go 程序调试吧?
|
3
yyzq007 114 天前
|
4
Nazz 114 天前 via Android
go install delve@latest 然后替换掉 goland 目录下的 dlv 就行了
|
5
vimiix 111 天前
和 golang 的 dl 原理一样。
https://github.com/golang/dl/blob/304e16060ce9dd939a4a94fd0add52bdd003b0dd/internal/version/version.go#L57 我是自己写个 shell 脚本,可以快速下载任意版本,再搭配 autoenv 可以实现不同项目自动切换 go 版本 https://gist.github.com/vimiix/0927fdfbea926e869a2c631db9eeae8b |