V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
body007
V2EX  ›  Go 编程语言

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

  •  
  •   body007 · 15 天前 · 1144 次点击

    公司项目用的可能不是最新 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)
    	}
    }
    
    5 条回复    2024-09-02 16:49:59 +08:00
    bv
        1
    bv  
       15 天前
    用最新版的 dlv 就行吧,高版本的 dlv 应该是兼容低版本 go 程序调试吧?
    body007
        2
    body007  
    OP
       15 天前
    @bv 要是能兼容我也不会想这办法了,网上搜到的都是 goland 新版自带 dlv 调试自己的项目有问题额。
    yyzq007
        3
    yyzq007  
       15 天前
    感谢分享
    Nazz
        4
    Nazz  
       15 天前 via Android
    go install delve@latest 然后替换掉 goland 目录下的 dlv 就行了
    vimiix
        5
    vimiix  
       12 天前
    和 golang 的 dl 原理一样。
    https://github.com/golang/dl/blob/304e16060ce9dd939a4a94fd0add52bdd003b0dd/internal/version/version.go#L57

    我是自己写个 shell 脚本,可以快速下载任意版本,再搭配 autoenv 可以实现不同项目自动切换 go 版本
    https://gist.github.com/vimiix/0927fdfbea926e869a2c631db9eeae8b
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1701 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:26 · PVG 00:26 · LAX 09:26 · JFK 12:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.