diff options
author | Arne Juul <arnej@vespa.ai> | 2024-03-18 14:51:07 +0000 |
---|---|---|
committer | Arne Juul <arnej@vespa.ai> | 2024-03-18 14:51:07 +0000 |
commit | f3c2bf61ca2ebde5fb1f80111dedd3619855f586 (patch) | |
tree | 80c865c39a5ab12f428339532894492a797e3266 /client | |
parent | 155775e8fe329c97df3087de374277a1e2383a7b (diff) |
print an explanation if a program dies from "illegal instruction"
Diffstat (limited to 'client')
-rw-r--r-- | client/go/internal/osutil/run_cmd.go | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/client/go/internal/osutil/run_cmd.go b/client/go/internal/osutil/run_cmd.go index ca0d621f9f9..3847dcc912a 100644 --- a/client/go/internal/osutil/run_cmd.go +++ b/client/go/internal/osutil/run_cmd.go @@ -5,9 +5,11 @@ package osutil import ( "bytes" + "fmt" "os" "os/exec" "strings" + "syscall" "github.com/vespa-engine/vespa/client/go/internal/admin/trace" ) @@ -21,6 +23,26 @@ const ( SystemCommand ) +func analyzeError(err error) string { + exitErr, wasEe := err.(*exec.ExitError) + if !wasEe { + return "" + } + status, wasWs := exitErr.ProcessState.Sys().(syscall.WaitStatus) + if !wasWs { + return err.Error() + } + if !status.Signaled() { + return "" + } + msg := "died with signal: " + status.Signal().String() + switch status.Signal() { + case syscall.SIGILL: + msg = msg + " (you probably have an older CPU than required)" + } + return msg +} + func (b BackTicks) Run(program string, args ...string) (string, error) { cmd := exec.Command(program, args...) var out bytes.Buffer @@ -38,5 +60,8 @@ func (b BackTicks) Run(program string, args ...string) (string, error) { } trace.Debug("running command:", program, strings.Join(args, " ")) err := cmd.Run() + if extraMsg := analyzeError(err); extraMsg != "" { + fmt.Fprintln(os.Stderr, "Problem running program", program, "=>", extraMsg) + } return out.String(), err } |