]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: improve diagnostics of non-copyable frames
authorDmitriy Vyukov <dvyukov@google.com>
Tue, 19 Aug 2014 07:46:19 +0000 (11:46 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Tue, 19 Aug 2014 07:46:19 +0000 (11:46 +0400)
LGTM=khr
R=golang-codereviews, khr
CC=golang-codereviews, rlh, rsc
https://golang.org/cl/124560043

src/pkg/runtime/stack.c

index b4e992e658c4850c8ed486f6834c9f616953cd89..3bd96ff31437bf9ccd8409692273c15e58034ade 100644 (file)
@@ -476,6 +476,9 @@ copyabletopsegment(G *gp)
        if(StackDebug >= 1 && cinfo.frames != -1)
                runtime·printf("copystack: %d copyable frames\n", cinfo.frames);
 
+       if(cinfo.frames == -1)
+               return -1;
+
        // Check to make sure all Defers are copyable
        for(d = gp->defer; d != nil; d = d->link) {
                if(cinfo.stk <= (byte*)d && (byte*)d < cinfo.base) {
@@ -490,8 +493,11 @@ copyabletopsegment(G *gp)
                if(fn == nil) // See issue 8047
                        continue;
                f = runtime·findfunc((uintptr)fn->fn);
-               if(f == nil)
+               if(f == nil) {
+                       if(StackDebug >= 1)
+                               runtime·printf("copystack: no func for deferred pc %p\n", fn->fn);
                        return -1;
+               }
 
                // Check to make sure we have an args pointer map for the defer's args.
                // We only need the args map, but we check
@@ -499,11 +505,17 @@ copyabletopsegment(G *gp)
                // isn't provided it means the ptr map came from C and
                // C (particularly, cgo) lies to us.  See issue 7695.
                stackmap = runtime·funcdata(f, FUNCDATA_ArgsPointerMaps);
-               if(stackmap == nil || stackmap->n <= 0)
+               if(stackmap == nil || stackmap->n <= 0) {
+                       if(StackDebug >= 1)
+                               runtime·printf("copystack: no arg info for deferred %s\n", runtime·funcname(f));
                        return -1;
+               }
                stackmap = runtime·funcdata(f, FUNCDATA_LocalsPointerMaps);
-               if(stackmap == nil || stackmap->n <= 0)
+               if(stackmap == nil || stackmap->n <= 0) {
+                       if(StackDebug >= 1)
+                               runtime·printf("copystack: no local info for deferred %s\n", runtime·funcname(f));
                        return -1;
+               }
 
                if(cinfo.stk <= (byte*)fn && (byte*)fn < cinfo.base) {
                        // FuncVal is on the stack.  Again, its copyableness