From 848a768ba76d7c386c2aa4f05bc2e9e51b5948b9 Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Thu, 5 Jun 2025 14:21:47 -0700 Subject: runtime: clarify stack traces for bubbled goroutines Use the synctest bubble ID to identify bubbles in traces, rather than the goroutine ID of the bubble's root goroutine. Some waitReasons include a "(synctest)" suffix to distinguish a durably blocking state from a non-durable one. For example, "chan send" vs. "chan send (synctest)". Change this suffix to "(durable)". Always print a "(durable)" sufix for the state of durably blocked bubbled goroutines. For example, print "sleep (durable)". Drop the "[not] durably blocked" text from goroutine states, since this is now entirely redundant with the waitReason. Old: goroutine 8 [chan receive (synctest), synctest bubble 7, durably blocked]: goroutine 9 [select (no cases), synctest bubble 7, durably blocked]: New: goroutine 8 [chan receive (durable), synctest bubble 1]: goroutine 9 [select (no cases) (durable), synctest bubble 1]: Change-Id: I89112efb25150a98a2954f54d1910ccec52a5824 Reviewed-on: https://go-review.googlesource.com/c/go/+/679376 Auto-Submit: Damien Neil LUCI-TryBot-Result: Go LUCI Reviewed-by: Michael Pratt --- src/runtime/traceback.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src/runtime/traceback.go') diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go index b3baa3b4ed..00c0f08e55 100644 --- a/src/runtime/traceback.go +++ b/src/runtime/traceback.go @@ -1248,6 +1248,13 @@ func goroutineheader(gp *g) { if isScan { print(" (scan)") } + if bubble := gp.bubble; bubble != nil && + gp.waitreason.isIdleInSynctest() && + !stringslite.HasSuffix(status, "(durable)") { + // If this isn't a status where the name includes a (durable) + // suffix to distinguish it from the non-durable form, add it here. + print(" (durable)") + } if waitfor >= 1 { print(", ", waitfor, " minutes") } @@ -1255,11 +1262,7 @@ func goroutineheader(gp *g) { print(", locked to thread") } if bubble := gp.bubble; bubble != nil { - print(", synctest bubble ", bubble.root.goid, ", ") - if !gp.waitreason.isIdleInSynctest() { - print("not ") - } - print("durably blocked") + print(", synctest bubble ", bubble.id) } print("]:\n") } -- cgit v1.3