]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: respect GOTRACEBACK for user-triggered runtime panics
authorJoe Tsai <joetsai@digital-static.net>
Thu, 13 Feb 2025 23:59:32 +0000 (15:59 -0800)
committerJoseph Tsai <joetsai@digital-static.net>
Mon, 24 Nov 2025 20:21:26 +0000 (12:21 -0800)
The documentation for GOTRACEBACK says that "single" is the default
where the stack trace for only a single routine is printed except
that it prints all stack traces if:

there is no current goroutine or
the failure is internal to the run-time.

In the runtime, there are two types of panics:
throwTypeUser and throwTypeRuntime.
The latter more clearly corresponds to a
"failure [that] is internal to the run-time",
while the former corresponds to a
problem trigger due to a user mistake.

Thus, a user-triggered panic (e.g., concurrent map access)
should not result in a dump of all stack traces.

Fixes #68019

Change-Id: I9b02f82535ddb9fd666f7158e2e4ee10f235646a
Reviewed-on: https://go-review.googlesource.com/c/go/+/649535
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/runtime1.go

index 43e4c1423629baf99e74437ad3e59328fb2177dd..64ee4c8d2e9b137111d50b26d207a98625f3a042 100644 (file)
@@ -39,7 +39,7 @@ func gotraceback() (level int32, all, crash bool) {
        gp := getg()
        t := atomic.Load(&traceback_cache)
        crash = t&tracebackCrash != 0
-       all = gp.m.throwing >= throwTypeUser || t&tracebackAll != 0
+       all = gp.m.throwing > throwTypeUser || t&tracebackAll != 0
        if gp.m.traceback != 0 {
                level = int32(gp.m.traceback)
        } else if gp.m.throwing >= throwTypeRuntime {