aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/dist
diff options
context:
space:
mode:
authorMichael Anthony Knyszek <mknyszek@google.com>2021-05-03 18:11:55 +0000
committerMichael Knyszek <mknyszek@google.com>2021-05-04 17:32:31 +0000
commitd83baa1aa22d074b44d8b705e1d8dafa30ecceb1 (patch)
tree4454ec48d855628cce35b1e1293a14c18398ffa1 /src/cmd/dist
parent10d625d5b41f17c118da18a592c683e60fcdcb3b (diff)
downloadgo-d83baa1aa22d074b44d8b705e1d8dafa30ecceb1.tar.gz
go-d83baa1aa22d074b44d8b705e1d8dafa30ecceb1.zip
cmd/dist,cmd/go: set GOTRACEBACK to "system" for testing
If we're testing through dist, we're testing the implementation of Go, so we're interested in any package failing with potential runtime issues. In these cases, we'd like to have as much relevant detail as possible, but currently runtime stack frames and goroutines are suppressed due to the default GOTRACEBACK setting. So, try to set GOTRACEBACK to system if it's unset. Check if it's unset first so we don't override the user asking for a lower or higher level. This change was brought up in the context of #45916, since there's an apparent deadlock (or something!) in the runtime that appears when running other code, but it's difficult to see exactly where it's blocked. However, this change is very generally useful. This change also runs scripted tests with GOTRACEBACK=system, upgrading from GOTRACEBACK=all. Often, script tests can trigger failures deep in the runtime in interesting ways because they start many individual Go processes, so being able to identify points of interest in the runtime is quite useful. For #45916. Change-Id: I3d50658d0d0090fb4c9182b87200d266c7f8f915 Reviewed-on: https://go-review.googlesource.com/c/go/+/316469 Trust: Michael Knyszek <mknyszek@google.com> Trust: Bryan C. Mills <bcmills@google.com> Run-TryBot: Michael Knyszek <mknyszek@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Diffstat (limited to 'src/cmd/dist')
-rw-r--r--src/cmd/dist/test.go28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go
index 33fabd3554..50bf80ba59 100644
--- a/src/cmd/dist/test.go
+++ b/src/cmd/dist/test.go
@@ -42,6 +42,7 @@ func cmdtest() {
if noRebuild {
t.rebuild = false
}
+
t.run()
}
@@ -117,6 +118,21 @@ func (t *tester) run() {
}
}
+ // Set GOTRACEBACK to system if the user didn't set a level explicitly.
+ // Since we're running tests for Go, we want as much detail as possible
+ // if something goes wrong.
+ //
+ // Set it before running any commands just in case something goes wrong.
+ if ok := isEnvSet("GOTRACEBACK"); !ok {
+ if err := os.Setenv("GOTRACEBACK", "system"); err != nil {
+ if t.keepGoing {
+ log.Printf("Failed to set GOTRACEBACK: %v", err)
+ } else {
+ fatalf("Failed to set GOTRACEBACK: %v", err)
+ }
+ }
+ }
+
if t.rebuild {
t.out("Building packages and commands.")
// Force rebuild the whole toolchain.
@@ -1664,3 +1680,15 @@ func isUnsupportedVMASize(w *work) bool {
unsupportedVMA := []byte("unsupported VMA range")
return w.dt.name == "race" && bytes.Contains(w.out, unsupportedVMA)
}
+
+// isEnvSet reports whether the environment variable evar is
+// set in the environment.
+func isEnvSet(evar string) bool {
+ evarEq := evar + "="
+ for _, e := range os.Environ() {
+ if strings.HasPrefix(e, evarEq) {
+ return true
+ }
+ }
+ return false
+}