]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: make traceback indicate whether _defer was just allocated
authorAustin Clements <austin@google.com>
Mon, 17 Dec 2018 19:23:56 +0000 (14:23 -0500)
committerAustin Clements <austin@google.com>
Mon, 17 Dec 2018 21:24:13 +0000 (21:24 +0000)
Many of the crashes observed in #27993 involve committing the new
_defer object at the end of newdefer. It would be helpful to know if
the _defer was just allocated or was retrieved from the defer pool. In
order to indicate this in the traceback, this CL duplicates the tail
of newdefer so that the PC/line number will tell us whether d is new
or not.

For #27993.

Change-Id: Icd3e23dbcf00461877bb082b6f18df701149a607
Reviewed-on: https://go-review.googlesource.com/c/154598
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/panic.go

index 5b989d28e98af75b39b8033122b5d49a30333c1d..81ff21113f98d83e18ec618f62eaf016598b48d4 100644 (file)
@@ -241,6 +241,15 @@ func newdefer(siz int32) *_defer {
                        total := roundupsize(totaldefersize(uintptr(siz)))
                        d = (*_defer)(mallocgc(total, deferType, true))
                })
+               if debugCachedWork {
+                       // Duplicate the tail below so if there's a
+                       // crash in checkPut we can tell if d was just
+                       // allocated or came from the pool.
+                       d.siz = siz
+                       d.link = gp._defer
+                       gp._defer = d
+                       return d
+               }
        }
        d.siz = siz
        d.link = gp._defer