From 1e8add5d895ff4d475f14d20d0aed7e4f3ca8448 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 4 Sep 2014 22:48:08 -0400 Subject: 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://codereview.appspot.com/133620043 --- src/pkg/runtime/asm_386.s | 7 ++++++- src/pkg/runtime/asm_amd64.s | 7 ++++++- src/pkg/runtime/asm_arm.s | 7 ++++++- src/pkg/runtime/traceback.go | 2 -- 4 files changed, 18 insertions(+), 5 deletions(-) (limited to 'src/pkg') diff --git a/src/pkg/runtime/asm_386.s b/src/pkg/runtime/asm_386.s index 87dd1fa0f..40271567b 100644 --- a/src/pkg/runtime/asm_386.s +++ b/src/pkg/runtime/asm_386.s @@ -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) diff --git a/src/pkg/runtime/asm_amd64.s b/src/pkg/runtime/asm_amd64.s index 80c2ab3c5..9103ef29e 100644 --- a/src/pkg/runtime/asm_amd64.s +++ b/src/pkg/runtime/asm_amd64.s @@ -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) diff --git a/src/pkg/runtime/asm_arm.s b/src/pkg/runtime/asm_arm.s index 54ef83621..3869696f6 100644 --- a/src/pkg/runtime/asm_arm.s +++ b/src/pkg/runtime/asm_arm.s @@ -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) diff --git a/src/pkg/runtime/traceback.go b/src/pkg/runtime/traceback.go index adb03440b..ec7be28dc 100644 --- a/src/pkg/runtime/traceback.go +++ b/src/pkg/runtime/traceback.go @@ -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 || -- cgit v1.2.1