From: Cherry Zhang Date: Fri, 15 Nov 2019 02:34:35 +0000 (-0500) Subject: runtime: print more information on stack overflow X-Git-Tag: go1.14beta1~94 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0f251028585e052a3d34dcce83b05d8aa9ba170e;p=gostls13.git runtime: print more information on stack overflow Print the current SP and (old) stack bounds when the stack grows too large. This helps to identify the problem: whether a large stack is used, or something else goes wrong. For #35470. Change-Id: I34a4064d5c7280978391d835e171b90d06f87222 Reviewed-on: https://go-review.googlesource.com/c/go/+/207351 Reviewed-by: Emmanuel Odeke --- diff --git a/src/runtime/crash_test.go b/src/runtime/crash_test.go index 6c3127fa75..5333b60646 100644 --- a/src/runtime/crash_test.go +++ b/src/runtime/crash_test.go @@ -204,9 +204,23 @@ func TestGoexitDeadlock(t *testing.T) { func TestStackOverflow(t *testing.T) { output := runTestProg(t, "testprog", "StackOverflow") - want := "runtime: goroutine stack exceeds 1474560-byte limit\nfatal error: stack overflow" - if !strings.HasPrefix(output, want) { - t.Fatalf("output does not start with %q:\n%s", want, output) + want := []string{ + "runtime: goroutine stack exceeds 1474560-byte limit\n", + "fatal error: stack overflow", + // information about the current SP and stack bounds + "runtime: sp=", + "stack=[", + } + if !strings.HasPrefix(output, want[0]) { + t.Errorf("output does not start with %q", want[0]) + } + for _, s := range want[1:] { + if !strings.Contains(output, s) { + t.Errorf("output does not contain %q", s) + } + } + if t.Failed() { + t.Logf("output:\n%s", output) } } diff --git a/src/runtime/stack.go b/src/runtime/stack.go index 84fbd33329..ebbe3e013d 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -1030,6 +1030,7 @@ func newstack() { newsize := oldsize * 2 if newsize > maxstacksize { print("runtime: goroutine stack exceeds ", maxstacksize, "-byte limit\n") + print("runtime: sp=", hex(sp), " stack=[", hex(gp.stack.lo), ", ", hex(gp.stack.hi), "]\n") throw("stack overflow") }