summaryrefslogtreecommitdiff
path: root/src/runtime/mgcwork.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/mgcwork.go')
-rw-r--r--src/runtime/mgcwork.go21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/runtime/mgcwork.go b/src/runtime/mgcwork.go
index cdc94b8ffb..0ed0713442 100644
--- a/src/runtime/mgcwork.go
+++ b/src/runtime/mgcwork.go
@@ -97,6 +97,10 @@ type gcWork struct {
// pauseGen causes put operations to spin while pauseGen ==
// gcWorkPauseGen if debugCachedWork is true.
pauseGen uint32
+
+ // pauseStack is the stack at which this P was paused if
+ // debugCachedWork is true.
+ pauseStack [16]uintptr
}
// Most of the methods of gcWork are go:nowritebarrierrec because the
@@ -128,6 +132,23 @@ func (w *gcWork) checkPut(ptr uintptr, ptrs []uintptr) {
for _, ptr := range ptrs {
gcDumpObject("ptrs", ptr, ^uintptr(0))
}
+ println("runtime: paused at")
+ for _, pc := range w.pauseStack {
+ if pc == 0 {
+ break
+ }
+ f := findfunc(pc)
+ if f.valid() {
+ // Obviously this doesn't
+ // relate to ancestor
+ // tracebacks, but this
+ // function prints what we
+ // want.
+ printAncestorTracebackFuncInfo(f, pc)
+ } else {
+ println("\tunknown PC ", hex(pc), "\n")
+ }
+ }
throw("throwOnGCWork")
}
}