From: Austin Clements Date: Mon, 17 Dec 2018 19:23:56 +0000 (-0500) Subject: runtime: make traceback indicate whether _defer was just allocated X-Git-Tag: go1.12beta1~27 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=db1e8a9e1f1b019dd7928ea239d5b0e4af66d9a6;p=gostls13.git runtime: make traceback indicate whether _defer was just allocated 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 TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek --- diff --git a/src/runtime/panic.go b/src/runtime/panic.go index 5b989d28e9..81ff21113f 100644 --- a/src/runtime/panic.go +++ b/src/runtime/panic.go @@ -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