diff options
| author | Dmitriy Vyukov <dvyukov@google.com> | 2014-08-19 11:46:19 +0400 |
|---|---|---|
| committer | Dmitriy Vyukov <dvyukov@google.com> | 2014-08-19 11:46:19 +0400 |
| commit | b3d5a695a6ad56fa33455eedf8d502a1a90a51ac (patch) | |
| tree | 07ef963a4dca0b6585f6652d0a5475d9b91d3762 /src/pkg/runtime/stack.c | |
| parent | 30ef2c7debeeb9f5bcab8cd2c60a8587f35bc0ae (diff) | |
| download | go-b3d5a695a6ad56fa33455eedf8d502a1a90a51ac.tar.xz | |
runtime: improve diagnostics of non-copyable frames
LGTM=khr
R=golang-codereviews, khr
CC=golang-codereviews, rlh, rsc
https://golang.org/cl/124560043
Diffstat (limited to 'src/pkg/runtime/stack.c')
| -rw-r--r-- | src/pkg/runtime/stack.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/pkg/runtime/stack.c b/src/pkg/runtime/stack.c index b4e992e658..3bd96ff314 100644 --- a/src/pkg/runtime/stack.c +++ b/src/pkg/runtime/stack.c @@ -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 |
