diff options
| author | Michael Anthony Knyszek <mknyszek@google.com> | 2025-04-02 01:37:30 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-05-20 11:16:40 -0700 |
| commit | eec8dd08362dc985a91bfead02107727b4643dcc (patch) | |
| tree | 2bc34bb56f56cfdf924d65afebf7ebf89d1813cb /src | |
| parent | 89af77deef7e554dff5ca21ff2c2aaf0a2d253ac (diff) | |
| download | go-eec8dd08362dc985a91bfead02107727b4643dcc.tar.xz | |
runtime: add scan trace for checkfinalizers>1
This change dumps a scan trace (each pointer marked and where it came
from) for the partial GC cycle performed by checkfinalizers mode when
checkfinalizers>1. This is useful for quickly understanding why certain
values are reachable without having to pull out tools like viewcore.
For #72949.
Change-Id: Ic583f80e9558cdfe1c667d27a1d975008dd39a9c
Reviewed-on: https://go-review.googlesource.com/c/go/+/662038
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/runtime/mcheckmark.go | 6 | ||||
| -rw-r--r-- | src/runtime/mgcmark.go | 3 |
2 files changed, 9 insertions, 0 deletions
diff --git a/src/runtime/mcheckmark.go b/src/runtime/mcheckmark.go index ebb19a0ceb..318f40f2eb 100644 --- a/src/runtime/mcheckmark.go +++ b/src/runtime/mcheckmark.go @@ -177,6 +177,9 @@ func checkFinalizersAndCleanups() { } // Run a checkmark GC using this cleanup and/or finalizer as a root. + if debug.checkfinalizers > 1 { + print("Scan trace for cleanup/finalizer on ", hex(p), ":\n") + } runCheckmark(func(gcw *gcWork) { switch sp.kind { case _KindSpecialFinalizer: @@ -185,6 +188,9 @@ func checkFinalizersAndCleanups() { gcScanCleanup((*specialCleanup)(unsafe.Pointer(sp)), gcw) } }) + if debug.checkfinalizers > 1 { + println() + } // Now check to see if the object the special is attached to was marked. // The roots above do not directly mark p, so if it is marked, then p diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index 41a4b1ab5a..b5318e56f8 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -1665,6 +1665,9 @@ func greyobject(obj, base, off uintptr, span *mspan, gcw *gcWork, objIndex uintp // Already marked. return } + if debug.checkfinalizers > 1 { + print(" mark ", hex(obj), " found at *(", hex(base), "+", hex(off), ")\n") + } } else { if debug.gccheckmark > 0 && span.isFree(objIndex) { print("runtime: marking free object ", hex(obj), " found at *(", hex(base), "+", hex(off), ")\n") |
