Skip to content

Commit

Permalink
runtime: print a message on bad morestack
Browse files Browse the repository at this point in the history
If morestack runs on the g0 or gsignal stack, it currently performs
some abort operation that typically produces a signal (e.g., it does
an INT $3 on x86). This is useful if you're running in a debugger, but
if you're not, the runtime tries to trap this signal, which is likely
to send the program into a deeper spiral of collapse and lead to very
confusing diagnostic output.

Help out people trying to debug without a debugger by making morestack
print an informative message before blowing up.

Change-Id: I2814c64509b137bfe20a00091d8551d18c2c4749
Reviewed-on: https://go-review.googlesource.com/31133
Run-TryBot: Austin Clements <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Rick Hudson <[email protected]>
Reviewed-by: Ian Lance Taylor <[email protected]>
  • Loading branch information
aclements committed Oct 17, 2016
1 parent 0ba3c60 commit 687d9d5
Show file tree
Hide file tree
Showing 9 changed files with 52 additions and 16 deletions.
6 changes: 4 additions & 2 deletions src/runtime/asm_386.s
Original file line number Diff line number Diff line change
Expand Up @@ -354,13 +354,15 @@ TEXT runtime·morestack(SB),NOSPLIT,$0-0
MOVL g_m(BX), BX
MOVL m_g0(BX), SI
CMPL g(CX), SI
JNE 2(PC)
JNE 3(PC)
CALL runtime·badmorestackg0(SB)
INT $3

// Cannot grow signal stack.
MOVL m_gsignal(BX), SI
CMPL g(CX), SI
JNE 2(PC)
JNE 3(PC)
CALL runtime·badmorestackgsignal(SB)
INT $3

// Called from f.
Expand Down
6 changes: 4 additions & 2 deletions src/runtime/asm_amd64.s
Original file line number Diff line number Diff line change
Expand Up @@ -331,13 +331,15 @@ TEXT runtime·morestack(SB),NOSPLIT,$0-0
MOVQ g_m(BX), BX
MOVQ m_g0(BX), SI
CMPQ g(CX), SI
JNE 2(PC)
JNE 3(PC)
CALL runtime·badmorestackg0(SB)
INT $3

// Cannot grow signal stack (m->gsignal).
MOVQ m_gsignal(BX), SI
CMPQ g(CX), SI
JNE 2(PC)
JNE 3(PC)
CALL runtime·badmorestackgsignal(SB)
INT $3

// Called from f.
Expand Down
6 changes: 4 additions & 2 deletions src/runtime/asm_amd64p32.s
Original file line number Diff line number Diff line change
Expand Up @@ -249,13 +249,15 @@ TEXT runtime·morestack(SB),NOSPLIT,$0-0
// Cannot grow scheduler stack (m->g0).
MOVL m_g0(BX), SI
CMPL g(CX), SI
JNE 2(PC)
JNE 3(PC)
CALL runtime·badmorestackg0(SB)
MOVL 0, AX

// Cannot grow signal stack (m->gsignal).
MOVL m_gsignal(BX), SI
CMPL g(CX), SI
JNE 2(PC)
JNE 3(PC)
CALL runtime·badmorestackgsignal(SB)
MOVL 0, AX

// Called from f.
Expand Down
8 changes: 6 additions & 2 deletions src/runtime/asm_arm.s
Original file line number Diff line number Diff line change
Expand Up @@ -281,12 +281,16 @@ TEXT runtime·morestack(SB),NOSPLIT,$-4-0
MOVW g_m(g), R8
MOVW m_g0(R8), R4
CMP g, R4
BL.EQ runtime·abort(SB)
BNE 3(PC)
BL runtime·badmorestackg0(SB)
B runtime·abort(SB)

// Cannot grow signal stack (m->gsignal).
MOVW m_gsignal(R8), R4
CMP g, R4
BL.EQ runtime·abort(SB)
BNE 3(PC)
BL runtime·badmorestackgsignal(SB)
B runtime·abort(SB)

// Called from f.
// Set g->sched to context in f.
Expand Down
6 changes: 4 additions & 2 deletions src/runtime/asm_arm64.s
Original file line number Diff line number Diff line change
Expand Up @@ -256,13 +256,15 @@ TEXT runtime·morestack(SB),NOSPLIT,$-8-0
MOVD g_m(g), R8
MOVD m_g0(R8), R4
CMP g, R4
BNE 2(PC)
BNE 3(PC)
BL runtime·badmorestackg0(SB)
B runtime·abort(SB)

// Cannot grow signal stack (m->gsignal).
MOVD m_gsignal(R8), R4
CMP g, R4
BNE 2(PC)
BNE 3(PC)
BL runtime·badmorestackgsignal(SB)
B runtime·abort(SB)

// Called from f.
Expand Down
6 changes: 4 additions & 2 deletions src/runtime/asm_mips64x.s
Original file line number Diff line number Diff line change
Expand Up @@ -231,12 +231,14 @@ TEXT runtime·morestack(SB),NOSPLIT,$-8-0
// Cannot grow scheduler stack (m->g0).
MOVV g_m(g), R7
MOVV m_g0(R7), R8
BNE g, R8, 2(PC)
BNE g, R8, 3(PC)
JAL runtime·badmorestackg0(SB)
JAL runtime·abort(SB)

// Cannot grow signal stack (m->gsignal).
MOVV m_gsignal(R7), R8
BNE g, R8, 2(PC)
BNE g, R8, 3(PC)
JAL runtime·badmorestackgsignal(SB)
JAL runtime·abort(SB)

// Called from f.
Expand Down
6 changes: 4 additions & 2 deletions src/runtime/asm_ppc64x.s
Original file line number Diff line number Diff line change
Expand Up @@ -284,13 +284,15 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
MOVD g_m(g), R7
MOVD m_g0(R7), R8
CMP g, R8
BNE 2(PC)
BNE 3(PC)
BL runtime·badmorestackg0(SB)
BL runtime·abort(SB)

// Cannot grow signal stack (m->gsignal).
MOVD m_gsignal(R7), R8
CMP g, R8
BNE 2(PC)
BNE 3(PC)
BL runtime·badmorestackgsignal(SB)
BL runtime·abort(SB)

// Called from f.
Expand Down
6 changes: 4 additions & 2 deletions src/runtime/asm_s390x.s
Original file line number Diff line number Diff line change
Expand Up @@ -279,13 +279,15 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
// Cannot grow scheduler stack (m->g0).
MOVD g_m(g), R7
MOVD m_g0(R7), R8
CMPBNE g, R8, 2(PC)
CMPBNE g, R8, 3(PC)
BL runtime·badmorestackg0(SB)
BL runtime·abort(SB)

// Cannot grow signal stack (m->gsignal).
MOVD m_gsignal(R7), R8
CMP g, R8
BNE 2(PC)
BNE 3(PC)
BL runtime·badmorestackgsignal(SB)
BL runtime·abort(SB)

// Called from f.
Expand Down
18 changes: 18 additions & 0 deletions src/runtime/proc.go
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,24 @@ func badreflectcall() {
panic(plainError("arg size to reflect.call more than 1GB"))
}

var badmorestackg0Msg = "fatal: morestack on g0\n"

//go:nosplit
//go:nowritebarrierrec
func badmorestackg0() {
sp := stringStructOf(&badmorestackg0Msg)
write(2, sp.str, int32(sp.len))
}

var badmorestackgsignalMsg = "fatal: morestack on gsignal\n"

//go:nosplit
//go:nowritebarrierrec
func badmorestackgsignal() {
sp := stringStructOf(&badmorestackgsignalMsg)
write(2, sp.str, int32(sp.len))
}

func lockedOSThread() bool {
gp := getg()
return gp.lockedm != nil && gp.m.lockedg != nil
Expand Down

0 comments on commit 687d9d5

Please sign in to comment.