1
0
mirror of https://github.com/golang/go synced 2024-10-01 01:28:32 -06:00

runtime: do not stop traceback at onM

Behavior before this CL:

1. If onM is called on a g0 stack, it just calls the given function.

2. If onM is called on a gsignal stack, it calls badonm.

3. If onM is called on a curg stack, it switches to the g0 stack
and then calls the function.

In cases 1 and 2, if the program then crashes (and badonm always does),
we want to see what called onM, but the traceback stops at onM.
In case 3, the traceback must stop at onM, because the g0
stack we are renting really does stop at onM.

The current code stops the traceback at onM to handle 3,
at the cost of making 1 and 2 crash with incomplete traces.

Change traceback to scan past onM but in case 3 make it look
like on the rented g0 stack, onM was called from mstart.
The traceback already knows that mstart is a top-of-stack function.

Alternate fix at CL 132610043 but I think this one is cleaner.
This CL makes 3 the exception, while that CL makes 1 and 2 the exception.

Submitting TBR to try to get better stack traces out of the
freebsd/amd64 builder, but happy to make changes in a
followup CL.

TBR=khr
R=khr
CC=golang-codereviews
https://golang.org/cl/133620043
This commit is contained in:
Russ Cox 2014-09-04 22:48:08 -04:00
parent cf3fd0a55f
commit d16a2ad09b
4 changed files with 18 additions and 5 deletions

View File

@ -233,7 +233,12 @@ oncurg:
// switch to g0
MOVL DX, g(CX)
MOVL (g_sched+gobuf_sp)(DX), SP
MOVL (g_sched+gobuf_sp)(DX), BX
// make it look like mstart called onM on g0, to stop traceback
SUBL $4, BX
MOVL $runtime·mstart(SB), DX
MOVL DX, 0(BX)
MOVL BX, SP
// call target function
ARGSIZE(0)

View File

@ -226,7 +226,12 @@ oncurg:
// switch to g0
MOVQ DX, g(CX)
MOVQ (g_sched+gobuf_sp)(DX), SP
MOVQ (g_sched+gobuf_sp)(DX), BX
// make it look like mstart called onM on g0, to stop traceback
SUBQ $8, BX
MOVQ $runtime·mstart(SB), DX
MOVQ DX, 0(BX)
MOVQ BX, SP
// call target function
ARGSIZE(0)

View File

@ -219,7 +219,12 @@ oncurg:
// switch to g0
MOVW R2, g
MOVW (g_sched+gobuf_sp)(R2), SP
MOVW (g_sched+gobuf_sp)(R2), R3
// make it look like mstart called onM on g0, to stop traceback
SUB $4, R3, R3
MOVW $runtime·mstart(SB), R4
MOVW R4, 0(R3)
MOVW R3, SP
// call target function
ARGSIZE(0)

View File

@ -40,7 +40,6 @@ var (
mstartPC = funcPC(mstart)
newprocPC = funcPC(newproc)
newstackPC = funcPC(newstack)
onMPC = funcPC(onM)
rt0_goPC = funcPC(rt0_go)
sigpanicPC = funcPC(sigpanic)
@ -633,7 +632,6 @@ func topofstack(f *_func) bool {
return pc == goexitPC ||
pc == mstartPC ||
pc == mcallPC ||
pc == onMPC ||
pc == morestackPC ||
pc == lessstackPC ||
pc == rt0_goPC ||