service/debugger: better error message for Go 1.11 executables

Output a better error message when users try to debug a Go 1.11
executable but delve was not built with Go 1.11.
This commit is contained in:
aarzilli 2018-07-05 12:15:22 +02:00 committed by Derek Parker
parent 0c15ca5f19
commit 8588e97b01

@ -1,6 +1,7 @@
package debugger package debugger
import ( import (
"debug/dwarf"
"errors" "errors"
"fmt" "fmt"
"go/parser" "go/parser"
@ -12,6 +13,7 @@ import (
"sync" "sync"
"time" "time"
"github.com/derekparker/delve/pkg/goversion"
"github.com/derekparker/delve/pkg/logflags" "github.com/derekparker/delve/pkg/logflags"
"github.com/derekparker/delve/pkg/proc" "github.com/derekparker/delve/pkg/proc"
"github.com/derekparker/delve/pkg/proc/core" "github.com/derekparker/delve/pkg/proc/core"
@ -89,6 +91,7 @@ func New(config *Config, processArgs []string) (*Debugger, error) {
} }
p, err := d.Attach(d.config.AttachPid, path) p, err := d.Attach(d.config.AttachPid, path)
if err != nil { if err != nil {
err = go11DecodeErrorCheck(err)
return nil, attachErrorMessage(d.config.AttachPid, err) return nil, attachErrorMessage(d.config.AttachPid, err)
} }
d.target = p d.target = p
@ -105,6 +108,7 @@ func New(config *Config, processArgs []string) (*Debugger, error) {
p, err = core.OpenCore(d.config.CoreFile, d.processArgs[0]) p, err = core.OpenCore(d.config.CoreFile, d.processArgs[0])
} }
if err != nil { if err != nil {
err = go11DecodeErrorCheck(err)
return nil, err return nil, err
} }
d.target = p d.target = p
@ -114,6 +118,7 @@ func New(config *Config, processArgs []string) (*Debugger, error) {
p, err := d.Launch(d.processArgs, d.config.WorkingDir) p, err := d.Launch(d.processArgs, d.config.WorkingDir)
if err != nil { if err != nil {
if err != proc.NotExecutableErr && err != proc.UnsupportedLinuxArchErr && err != proc.UnsupportedWindowsArchErr && err != proc.UnsupportedDarwinArchErr { if err != proc.NotExecutableErr && err != proc.UnsupportedLinuxArchErr && err != proc.UnsupportedWindowsArchErr && err != proc.UnsupportedDarwinArchErr {
err = go11DecodeErrorCheck(err)
err = fmt.Errorf("could not launch process: %s", err) err = fmt.Errorf("could not launch process: %s", err)
} }
return nil, err return nil, err
@ -1042,3 +1047,16 @@ func (d *Debugger) ClearCheckpoint(id int) error {
defer d.processMutex.Unlock() defer d.processMutex.Unlock()
return d.target.ClearCheckpoint(id) return d.target.ClearCheckpoint(id)
} }
func go11DecodeErrorCheck(err error) error {
if _, isdecodeerr := err.(dwarf.DecodeError); !isdecodeerr {
return err
}
gover, ok := goversion.Installed()
if !ok || !gover.AfterOrEqual(goversion.GoVersion{1, 11, -1, 0, 0, ""}) || goversion.VersionAfterOrEqual(runtime.Version(), 1, 11) {
return err
}
return fmt.Errorf("executables built by Go 1.11 or later need Delve built by Go 1.11 or later")
}