mirror of https://github.com/golang/go.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 <emm.odeke@gmail.com>
This commit is contained in:
parent
b2482e4817
commit
0f25102858
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue