aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/traceback_arm.c
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2013-07-18 16:53:45 -0400
committerRuss Cox <rsc@golang.org>2013-07-18 16:53:45 -0400
commit58f12ffd79df8ae369afa7ec60ee26d72ce2d843 (patch)
treeccc2d561a416544b0fe46cc729d244bc47ecd19d /src/pkg/runtime/traceback_arm.c
parent8c741c97f710c1e197cd7d2d02d8380dbb759859 (diff)
downloadgo-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.c11
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;