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 <emm.odeke@gmail.com>
This commit is contained in:
Cherry Zhang 2019-11-14 21:34:35 -05:00
parent b2482e4817
commit 0f25102858
2 changed files with 18 additions and 3 deletions

View file

@ -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)
}
}