]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: add scan trace for checkfinalizers>1
authorMichael Anthony Knyszek <mknyszek@google.com>
Wed, 2 Apr 2025 01:37:30 +0000 (01:37 +0000)
committerGopher Robot <gobot@golang.org>
Tue, 20 May 2025 18:16:40 +0000 (11:16 -0700)
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>

src/runtime/mcheckmark.go
src/runtime/mgcmark.go

index ebb19a0ceb9d39cfbc1d8ec72693ab441d1f87cd..318f40f2ebc5fe79e6d8a98de73cfb92762a7fb3 100644 (file)
@@ -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
index 41a4b1ab5a83c368362da220bd0d567659702cf5..b5318e56f8839e634f47d6befd15ab3c7edd3d7f 100644 (file)
@@ -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")