aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/panic.go
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2018-12-17 14:23:56 -0500
committerAustin Clements <austin@google.com>2018-12-17 21:24:13 +0000
commitdb1e8a9e1f1b019dd7928ea239d5b0e4af66d9a6 (patch)
treea6ff9ad9a7c8da5c070cac56b3d4b9316652b953 /src/runtime/panic.go
parent3c255e8bc6964ebee580b44835ddbe95c893e29f (diff)
downloadgo-db1e8a9e1f1b019dd7928ea239d5b0e4af66d9a6.tar.xz
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 <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/runtime/panic.go')
-rw-r--r--src/runtime/panic.go9
1 files changed, 9 insertions, 0 deletions
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