diff options
| author | Russ Cox <rsc@golang.org> | 2013-07-18 16:53:45 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2013-07-18 16:53:45 -0400 |
| commit | 58f12ffd79df8ae369afa7ec60ee26d72ce2d843 (patch) | |
| tree | ccc2d561a416544b0fe46cc729d244bc47ecd19d /src/pkg/runtime/traceback_arm.c | |
| parent | 8c741c97f710c1e197cd7d2d02d8380dbb759859 (diff) | |
| download | go-58f12ffd79df8ae369afa7ec60ee26d72ce2d843.tar.xz | |
runtime: handle morestack/lessstack in stack trace
If we start a garbage collection on g0 during a
stack split or unsplit, we'll see morestack or lessstack
at the top of the stack. Record an argument frame size
for those, and record that they terminate the stack.
R=golang-dev, dvyukov
CC=golang-dev
https://golang.org/cl/11533043
Diffstat (limited to 'src/pkg/runtime/traceback_arm.c')
| -rw-r--r-- | src/pkg/runtime/traceback_arm.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/pkg/runtime/traceback_arm.c b/src/pkg/runtime/traceback_arm.c index 43dcd1cf8c..73ae2225bb 100644 --- a/src/pkg/runtime/traceback_arm.c +++ b/src/pkg/runtime/traceback_arm.c @@ -69,7 +69,8 @@ runtime·gentraceback(uintptr pc0, uintptr sp0, uintptr lr0, G *gp, int32 skip, f = runtime·findfunc(frame.pc); if(f == nil) { runtime·printf("runtime: unknown pc %p after stack split\n", frame.pc); - runtime·throw("unknown pc"); + if(callback != nil) + runtime·throw("unknown pc"); } frame.fn = f; continue; @@ -89,7 +90,8 @@ runtime·gentraceback(uintptr pc0, uintptr sp0, uintptr lr0, G *gp, int32 skip, flr = runtime·findfunc(frame.lr); if(flr == nil) { runtime·printf("runtime: unexpected return pc for %s called from %p\n", runtime·funcname(f), frame.lr); - runtime·throw("unknown caller pc"); + if(callback != nil) + runtime·throw("unknown caller pc"); } } @@ -112,7 +114,7 @@ runtime·gentraceback(uintptr pc0, uintptr sp0, uintptr lr0, G *gp, int32 skip, else { runtime·printf("runtime: unknown argument frame size for %s called from %p [%s]\n", runtime·funcname(f), frame.lr, flr ? runtime·funcname(flr) : "?"); - if(!printing) + if(callback != nil) runtime·throw("invalid stack"); frame.arglen = 0; } @@ -131,7 +133,8 @@ runtime·gentraceback(uintptr pc0, uintptr sp0, uintptr lr0, G *gp, int32 skip, } else { if(f->locals > frame.fp - frame.sp) { runtime·printf("runtime: inconsistent locals=%p frame=%p fp=%p sp=%p for %s\n", (uintptr)f->locals, (uintptr)f->frame, frame.fp, frame.sp, runtime·funcname(f)); - runtime·throw("invalid stack"); + if(callback != nil) + runtime·throw("invalid stack"); } frame.varp = (byte*)frame.fp - f->locals; frame.varlen = f->locals; |
