]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: print blocking status of bubbled goroutines in stacks
authorDamien Neil <dneil@google.com>
Fri, 9 May 2025 18:07:14 +0000 (11:07 -0700)
committerGopher Robot <gobot@golang.org>
Tue, 20 May 2025 19:36:29 +0000 (12:36 -0700)
For goroutines in a synctest bubble, include whether the goroutine
is "durably blocked" or not in the goroutine status.

Synctest categorizes goroutines in certain states as "durably"
blocked, where the goroutine is not merely idle but can only
be awoken by another goroutine in its bubble. To make it easier
for users to understand why a bubble is or is not idle,
print the state of each bubbled goroutine.

For example:

  goroutine 36 [chan receive, synctest bubble 34, not durably blocked]:
  goroutine 37 [chan receive (synctest), synctest bubble 34, durably blocked]:

Goroutine 36 is receiving from a channel created outside its bubble.
Goroutine 36 is receiving from a channel created inside its bubble.

For #67434

Change-Id: I006b656a9ce7eeb75b2be21e748440a5dd57ceb0
Reviewed-on: https://go-review.googlesource.com/c/go/+/670976
Auto-Submit: Damien Neil <dneil@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
src/runtime/traceback.go

index 276e601f7c0199761951561983717c37ffbc34f0..b3baa3b4eded137f9617640d77bae1920736aa40 100644 (file)
@@ -1255,7 +1255,11 @@ func goroutineheader(gp *g) {
                print(", locked to thread")
        }
        if bubble := gp.bubble; bubble != nil {
-               print(", synctest bubble ", bubble.root.goid)
+               print(", synctest bubble ", bubble.root.goid, ", ")
+               if !gp.waitreason.isIdleInSynctest() {
+                       print("not ")
+               }
+               print("durably blocked")
        }
        print("]:\n")
 }