diff options
| author | Russ Cox <rsc@golang.org> | 2014-06-01 13:57:46 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2014-06-01 13:57:46 -0400 |
| commit | bcfe519d58e0ef99faad76b7d13108cd48d75e32 (patch) | |
| tree | ed7ebd04b2792c46ed1089e2fd2207225c906922 /src/pkg/runtime/traceback_arm.c | |
| parent | aa92b3e5d4b649f630a161a50b86c456b8f40277 (diff) | |
| download | go-bcfe519d58e0ef99faad76b7d13108cd48d75e32.tar.xz | |
runtime: fix correctness test at end of traceback
We were requiring that the defer stack and the panic stack
be completely processed, thinking that if any were left over
the stack scan and the defer stack/panic stack must be out
of sync. It turns out that the panic stack may well have
leftover entries in some situations, and that's okay.
Fixes #8132.
LGTM=minux, r
R=golang-codereviews, minux, r
CC=golang-codereviews, iant, khr
https://golang.org/cl/100900044
Diffstat (limited to 'src/pkg/runtime/traceback_arm.c')
| -rw-r--r-- | src/pkg/runtime/traceback_arm.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/pkg/runtime/traceback_arm.c b/src/pkg/runtime/traceback_arm.c index 8acd143a5c..8d1fc54266 100644 --- a/src/pkg/runtime/traceback_arm.c +++ b/src/pkg/runtime/traceback_arm.c @@ -261,11 +261,20 @@ runtime·gentraceback(uintptr pc0, uintptr sp0, uintptr lr0, G *gp, int32 skip, if(pcbuf == nil && callback == nil) n = nprint; - if(callback != nil && n < max && (defer != nil || panic != nil && panic->defer != nil)) { + // For rationale, see long comment in traceback_x86.c. + if(callback != nil && n < max && defer != nil) { if(defer != nil) runtime·printf("runtime: g%D: leftover defer argp=%p pc=%p\n", gp->goid, defer->argp, defer->pc); - if(panic != nil && panic->defer != nil) + if(panic != nil) runtime·printf("runtime: g%D: leftover panic argp=%p pc=%p\n", gp->goid, panic->defer->argp, panic->defer->pc); + for(defer = gp->defer; defer != nil; defer = defer->link) + runtime·printf("\tdefer %p argp=%p pc=%p\n", defer, defer->argp, defer->pc); + for(panic = gp->panic; panic != nil; panic = panic->link) { + runtime·printf("\tpanic %p defer %p", panic, panic->defer); + if(panic->defer != nil) + runtime·printf(" argp=%p pc=%p", panic->defer->argp, panic->defer->pc); + runtime·printf("\n"); + } runtime·throw("traceback has leftover defers or panics"); } |
