-
Notifications
You must be signed in to change notification settings - Fork 18.5k
Closed
Labels
Milestone
Description
What version of Go are you using (go version)?
$ go version 2545323c633136a28aa57b000b81e95780cbac13
Does this issue reproduce with the latest release?
no. Go1.13 doing fine.
What operating system and processor architecture are you using (go env)?
linux/arm64
linux/mips64le
What did you do?
import (
"fmt"
)
func main() {
for i := 0; i < 10000; i++ {
n := 150
r := deferHeapAndStack(n)
if r != n*2 {
fmt.Println(i, r)
}
}
}
// deferHeapAndStack(n) computes 2*n
func deferHeapAndStack(n int) (r int) {
if n == 0 {
return 0
}
if n%2 == 0 {
// heap-allocated defers
for i := 0; i < 2; i++ {
defer func() {
r++
}()
}
} else {
// stack-allocated defers
defer func() {
r++
}()
defer func() {
r++
}()
}
r = deferHeapAndStack(n - 1)
escapeMe(new([1024]byte)) // force some GCs
return
}
// Pass a value to escapeMe to force it to escape.
var escapeMe = func(x interface{}) {}
What did you see instead?
GODEBUG='gctrace=1,gcstoptheworld=1' ./defer
runtime: checkdead: find g 1 in status 1
fatal error: checkdead: runnable g
runtime stack:
runtime.throw(0xd0caf, 0x15)
/root/godev/src/runtime/panic.go:1116 +0x54
runtime.checkdead()
/root/godev/src/runtime/proc.go:4489 +0x43c
runtime.mput(...)
/root/godev/src/runtime/proc.go:4906
runtime.stopm()
/root/godev/src/runtime/proc.go:1879 +0x9c
runtime.findrunnable(0x4000022800, 0x0)
/root/godev/src/runtime/proc.go:2413 +0xa2c
runtime.schedule()
/root/godev/src/runtime/proc.go:2613 +0x31c
runtime.preemptPark(0x4000000180)
/root/godev/src/runtime/proc.go:2851 +0xb4
runtime.newstack()
/root/godev/src/runtime/stack.go:1026 +0x1e0
runtime.morestack()
/root/godev/src/runtime/asm_arm64.s:308 +0x70
goroutine 1 [runnable]:
main.deferHeapAndStack(0x281, 0xd5d90)
/root/defer.go:41 +0xd8
main.deferHeapAndStack(0x282, 0x40004979b0)
/root/defer.go:40 +0xbc
main.deferHeapAndStack(0x283, 0xd5d90)
/root/defer.go:40 +0xbc
main.deferHeapAndStack(0x284, 0x40004979a0)
Might relate to #34736