]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix dumpgoroutine() to deal with open-coded defers
authorDan Scales <danscales@google.com>
Sat, 26 Oct 2019 13:53:07 +0000 (06:53 -0700)
committerDan Scales <danscales@google.com>
Mon, 28 Oct 2019 01:00:20 +0000 (01:00 +0000)
_defer.fn can be nil, so we need to add a check when dumping
_defer.fn.fn.

Fixes #35172

Change-Id: Ic1138be5ec9dce915a87467cfa51ff83acc6e3a9
Reviewed-on: https://go-review.googlesource.com/c/go/+/203697
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
src/runtime/heapdump.go
src/runtime/runtime2.go

index 992df6391e9c1838c0e85ea24d2b0510f89c110f..4d55b316f7fe35922aed73db2c7b49f75c208da2 100644 (file)
@@ -371,7 +371,12 @@ func dumpgoroutine(gp *g) {
                dumpint(uint64(d.sp))
                dumpint(uint64(d.pc))
                dumpint(uint64(uintptr(unsafe.Pointer(d.fn))))
-               dumpint(uint64(uintptr(unsafe.Pointer(d.fn.fn))))
+               if d.fn == nil {
+                       // d.fn can be nil for open-coded defers
+                       dumpint(uint64(0))
+               } else {
+                       dumpint(uint64(uintptr(unsafe.Pointer(d.fn.fn))))
+               }
                dumpint(uint64(uintptr(unsafe.Pointer(d.link))))
        }
        for p := gp._panic; p != nil; p = p.link {
index eecc6a78accdee5f77238fd033f13f8436191695..c31919655721f9bd999e016bd0d6d78ff2128a87 100644 (file)
@@ -824,10 +824,10 @@ type _defer struct {
        // defers. We have only one defer record for the entire frame (which may
        // currently have 0, 1, or more defers active).
        openDefer bool
-       sp        uintptr // sp at time of defer
-       pc        uintptr // pc at time of defer
-       fn        *funcval
-       _panic    *_panic // panic that is running defer
+       sp        uintptr  // sp at time of defer
+       pc        uintptr  // pc at time of defer
+       fn        *funcval // can be nil for open-coded defers
+       _panic    *_panic  // panic that is running defer
        link      *_defer
 
        // If openDefer is true, the fields below record values about the stack