aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorDamien Neil <dneil@google.com>2025-05-09 11:07:14 -0700
committerGopher Robot <gobot@golang.org>2025-05-20 12:36:29 -0700
commitb7382cc1f012016c91036c49db0ea6db444b47d8 (patch)
tree2ff9902d6fc7c351cb873d4c76ace863fcf3c30e /src/runtime
parente27a6e9e5369a3ba4082f025384019ba066f48ba (diff)
downloadgo-b7382cc1f012016c91036c49db0ea6db444b47d8.tar.xz
runtime: print blocking status of bubbled goroutines in stacks
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>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/traceback.go6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go
index 276e601f7c..b3baa3b4ed 100644
--- a/src/runtime/traceback.go
+++ b/src/runtime/traceback.go
@@ -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")
}