aboutsummaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorArne Juul <arnej@vespa.ai>2024-03-18 14:51:07 +0000
committerArne Juul <arnej@vespa.ai>2024-03-18 14:51:07 +0000
commitf3c2bf61ca2ebde5fb1f80111dedd3619855f586 (patch)
tree80c865c39a5ab12f428339532894492a797e3266 /client
parent155775e8fe329c97df3087de374277a1e2383a7b (diff)
print an explanation if a program dies from "illegal instruction"
Diffstat (limited to 'client')
-rw-r--r--client/go/internal/osutil/run_cmd.go25
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
}