Open https://swtch.com/tmp/wasmbug/ in Chrome. Open the developer console (right click on page, Inspect, then click the Console tab). It should say "Go starting". Now click Run. You should see an "Uncaught RangeError: Maximum call stack size exceeded":
0133597e:0x6304a Uncaught RangeError: Maximum call stack size exceeded
at runtime.__mspan_.init (0133597e:0x6304a)
at runtime.__mheap_.initSpan (0133597e:0x612a5)
at runtime.__mheap_.allocSpan (0133597e:0x60bf7)
at runtime.__mheap_.alloc.func1 (0133597e:0x5f504)
at runtime.systemstack (0133597e:0xfe0bd)
at runtime.__mheap_.alloc (0133597e:0x5f361)
at runtime.__mcentral_.grow (0133597e:0x28d09)
at runtime.__mcentral_.cacheSpan (0133597e:0x28161)
at runtime.__mcache_.refill (0133597e:0x26ca7)
at runtime.__mcache_.nextFree (0133597e:0x1c94b)
I'm a little surprised that it shows this stack and not a stack inside user code if the stack is too big. Perhaps this is the "m" stack and it is not supposed to be overflowing?
I am not sure whether Go is expected to continue at this point, but it seems to still be running. Click Run again.
Now you should see a fatal error like this:
fatal error: bad sweepgen in refill
wasm_exec.js:22
runtime stack:
wasm_exec.js:22 runtime.throw({0x46795, 0x16})
wasm_exec.js:22 /Users/rsc/go/src/runtime/panic.go:1099 +0x3 fp=0x24eec8 sp=0x24eea0 pc=0x143d0003
wasm_exec.js:22 runtime.(*mcache).refill(0x250108, 0x5)
wasm_exec.js:22 /Users/rsc/go/src/runtime/mcache.go:158 +0x29 fp=0x24ef18 sp=0x24eec8 pc=0x10b50029
wasm_exec.js:22 runtime.(*mcache).nextFree(0x250108, 0x5)
wasm_exec.js:22 /Users/rsc/go/src/runtime/malloc.go:964 +0xa fp=0x24ef50 sp=0x24ef18 pc=0x1088000a
wasm_exec.js:22 runtime.mallocgcTiny(0x8, 0x19840, 0x1)
wasm_exec.js:22 /Users/rsc/go/src/runtime/malloc.go:1175 +0x48 fp=0x24efa8 sp=0x24ef50 pc=0x10890048
wasm_exec.js:22 runtime.mallocgc(0x8, 0x19840, 0x1)
wasm_exec.js:22 /Users/rsc/go/src/runtime/malloc.go:1053 +0x15 fp=0x24efe0 sp=0x24efa8 pc=0x141e0015
wasm_exec.js:22 runtime.newobject(0x19840)
wasm_exec.js:22 /Users/rsc/go/src/runtime/malloc.go:1714 +0x4 fp=0x24f008 sp=0x24efe0 pc=0x10920004
wasm_exec.js:22 syscall/js.makeValue(0x7ff8000100000014)
wasm_exec.js:22 /Users/rsc/go/src/syscall/js/js.go:51 +0x5 fp=0x24f038 sp=0x24f008 pc=0x166d0005
wasm_exec.js:22 syscall/js.Value.Get({{}, 0x7ff8000100000006, 0x0}, {0x442f4, 0xd})
wasm_exec.js:22 /Users/rsc/go/src/syscall/js/js.go:298 +0x9 fp=0x24f078 sp=0x24f038 pc=0x16740009
wasm_exec.js:22 syscall/js.handleEvent()
wasm_exec.js:22 /Users/rsc/go/src/syscall/js/func.go:90 +0x2 fp=0x24f158 sp=0x24f078 pc=0x166c0002
wasm_exec.js:22 runtime.handleEvent()
wasm_exec.js:22 /Users/rsc/go/src/runtime/lock_js.go:287 +0x16 fp=0x24f1c8 sp=0x24f158 pc=0x10820016
wasm_exec.js:22 runtime.(*mheap).initSpan(0x241860, 0x372078, 0x0, 0x5, 0x5e4000, 0x1)
wasm_exec.js:22 /Users/rsc/go/src/runtime/mheap.go:1393 +0x2 fp=0x24f208 sp=0x24f1c8 pc=0x117b0002
wasm_exec.js:22 runtime.(*mheap).allocSpan(0x241860, 0x1, 0x0, 0x5)
wasm_exec.js:22 /Users/rsc/go/src/runtime/mheap.go:1346 +0x8e fp=0x24f2d0 sp=0x24f208 pc=0x117a008e
wasm_exec.js:22 runtime.(*mheap).alloc.func1()
wasm_exec.js:22 /Users/rsc/go/src/runtime/mheap.go:970 +0xb fp=0x24f318 sp=0x24f2d0 pc=0x1175000b
wasm_exec.js:22 runtime.systemstack(0x24f328)
wasm_exec.js:22 /Users/rsc/go/src/runtime/asm_wasm.s:172 +0x3 fp=0x24f320 sp=0x24f318 pc=0x14760003
wasm_exec.js:22 runtime.mstart()
wasm_exec.js:22 /Users/rsc/go/src/runtime/asm_wasm.s:29 fp=0x24f328 sp=0x24f320 pc=0x14720000
As I said, it is unclear to me whether the bug is the original RangeError or that it can't continue after the RangeError.
To reproduce:
git clone https://github.com/rsc/tmp
cd tmp/wasmshell
go generate # builds main.wasm, copies wasm_exec.js into local directory
go run serve.go
open http://localhost:8001/
Comment From: gabyhelp
Related Issues
- runtime : fatal error: malloc deadlock #41775 (closed)
- runtime: `found bad pointer in Go heap` on `wasm` ports testing `x/tools/go/ssa.TestTypeparamTest/chans.go` #64726 (closed)
- runtime: "slice bounds out of range" in runtime.(*addrRanges).add on js-wasm builder #36113 (closed)
- runtime: macOS-only segfault on 1.14+ with "split stack overflow" #39079 (closed)
- cmd/compile: uncaught RuntimeError: memory access out of bounds #38093 (closed)
- runtime: wasm runtime crashes under certain/undefined conditions #38574 (closed)
- misc/wasm, runtime: calling fmt.Println in different goroutines causes a crash #40081 (closed)
- runtime: fatal error: sweep increased allocation count in go1.7 #16778 (closed)
- runtime: spans corruption #7544 (closed)
- errors: unbounded recursion with array Unwrap() #59098 (closed)
(Emoji vote if this was helpful or unhelpful; more detailed feedback welcome in this discussion.)
Comment From: rsc
/cc @golang/wasm
Comment From: rsc
Opening the toggle, I see that this is not an m stack. At least, there is Go user code too:
$runtime.__mspan_.init | @ | 0133597e:0x6304a | |
---|---|---|---|
$runtime.__mheap_.initSpan | @ | 0133597e:0x612a5 | |
$runtime.__mheap_.allocSpan | @ | 0133597e:0x60bf7 | |
$runtime.__mheap_.alloc.func1 | @ | 0133597e:0x5f504 | |
$runtime.systemstack | @ | 0133597e:0xfe0bd | |
$runtime.__mheap_.alloc | @ | 0133597e:0x5f361 | |
$runtime.__mcentral_.grow | @ | 0133597e:0x28d09 | |
$runtime.__mcentral_.cacheSpan | @ | 0133597e:0x28161 | |
$runtime.__mcache_.refill | @ | 0133597e:0x26ca7 | |
$runtime.__mcache_.nextFree | @ | 0133597e:0x1c94b | |
$runtime.mallocgcTiny | @ | 0133597e:0x1d295 | |
$runtime.mallocgc | @ | 0133597e:0xf3368 | |
$runtime.convT64 | @ | 0133597e:0xf2c63 | |
$robpike.io_ivy_value.__Int_.Inner | @ | 0133597e:0x2d7bbf | |
$robpike.io_ivy_value.whichType | @ | 0133597e:0x240423 | |
$robpike.io_ivy_value.__binaryOp_.EvalBinary | @ | 0133597e:0x24094d | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbbab | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 | |
$robpike.io_ivy_exec.__Function_.EvalBinary | @ | 0133597e:0x2e3186 | |
$robpike.io_ivy_exec.__Context_.EvalBinary | @ | 0133597e:0x2df9da | |
$robpike.io_ivy_parse.__binary_.Eval | @ | 0133597e:0x2fbdb8 | |
$robpike.io_ivy_value.EvalFunctionBody | @ | 0133597e:0x258df7 |
Comment From: cherrymui
https://github.com/golang/go/issues/70829#issuecomment-2541785258 looks like there is indeed a deep recursion. At systemstack
we just change the SP to point to the M stack in the linear memory, without unwinding the user frames on the Wasm call stack, so from Wasm's perspective it is adding more frames. Perhaps the deep recursion on the user stack is already close to the limit.
Comment From: rsc
In non-web Ivy I measured the call depth at 25,573, corresponding to 4X that in Go frames. Playing with Ivy's )maxstack
, I found that
op a gcd b = a == b: a; a > b: b gcd a-b; a gcd b-a
)maxstack 1800
1562 gcd !11
is right around the line where it stops working reliably. Using 1700 makes Ivy consistently stop before hitting the limit. Using 1800, it works about half the time; the other half have RangeError; but there is no crash. Using 1900, you have to click Run a handful of times to get a crash. Using 2000, the first time works but the second usually crashes.
Sometimes I see things like "fatal: sched holding locks", which makes me think that the problem is that when the stack overflow happens, the wasm runtime just unwinds the stack, but the Go code has not had a chance to clean up. So it might be holding locks, didn't run defers, and so on. And perhaps the goroutine gets reused for the next call.
I'm starting to believe more strongly that the RangeError needs to be handled by wasm_exec and have it just tear down Go entirely.
Comment From: cherrymui
I'm starting to believe more strongly that the RangeError needs to be handled by wasm_exec and have it just tear down Go entirely.
It looks like _makeFuncWrapper
(the counter part of js.FuncOf
in wasm_exec.js) perhaps should try to catch error and terminate the Go instance? I'm not good at JavaScript to tell for sure.
Comment From: Zxilly
_resume() {
if (this.exited) {
throw new Error("Go program has already exited");
}
try {
this._inst.exports.resume();
} catch (err) {
if (err instanceof RangeError) {
// runtime.throw
this._inst.exports.throw(err.message);
this.exited = true;
this._resolveExitPromise();
throw err;
}
}
if (this.exited) {
this._resolveExitPromise();
}
}
I was able to catch RangeError
correctly after modifying _resume
in wasm_exec.js
as above.
Comment From: gopherbot
Change https://go.dev/cl/636315 mentions this issue: wasm: terminate instance while met stackoverflow