From 05dc6b26ca337b80f9424aa9b78f4b45f6e44c8d Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 17 Nov 2016 10:48:40 -0500 Subject: [PATCH] runtime: improve diagnostics for "scan missed a g" Currently there are no diagnostics for mark root check during marking. Fix this by printing out the same diagnostics we print during mark termination. Also, drop the allglock before throwing. Holding that across a throw causes a self-deadlock with tracebackothers. For #16083. Change-Id: Ib605f3ae0c17e70704b31d8378274cfaa2307dc2 Reviewed-on: https://go-review.googlesource.com/33339 Reviewed-by: Rick Hudson --- src/runtime/mgcmark.go | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index 00787ade04..cfd24e06fb 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -126,26 +126,32 @@ func gcMarkRootCheck() { lock(&allglock) // Check that stacks have been scanned. + var gp *g if gcphase == _GCmarktermination && debug.gcrescanstacks > 0 { for i := 0; i < len(allgs); i++ { - gp := allgs[i] + gp = allgs[i] if !(gp.gcscandone && gp.gcscanvalid) && readgstatus(gp) != _Gdead { - println("gp", gp, "goid", gp.goid, - "status", readgstatus(gp), - "gcscandone", gp.gcscandone, - "gcscanvalid", gp.gcscanvalid) - throw("scan missed a g") + goto fail } } } else { for i := 0; i < work.nStackRoots; i++ { - gp := allgs[i] + gp = allgs[i] if !gp.gcscandone { - throw("scan missed a g") + goto fail } } } unlock(&allglock) + return + +fail: + println("gp", gp, "goid", gp.goid, + "status", readgstatus(gp), + "gcscandone", gp.gcscandone, + "gcscanvalid", gp.gcscanvalid) + unlock(&allglock) // Avoid self-deadlock with traceback. + throw("scan missed a g") } // ptrmask for an allocation containing a single pointer. -- 2.50.0