diff options
| author | Russ Cox <rsc@golang.org> | 2011-02-02 16:44:20 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2011-02-02 16:44:20 -0500 |
| commit | b287d7cbe1794ab7e0834e9ad3a9a7a714fde8e7 (patch) | |
| tree | fa483eec67e4fa1f7193b14526315a671431ea11 /src/pkg/runtime/runtime.c | |
| parent | 827e98d4fdbb470adf4dd5caafe88ea14e902047 (diff) | |
| download | go-b287d7cbe1794ab7e0834e9ad3a9a7a714fde8e7.tar.xz | |
runtime: more detailed panic traces, line number work
Follow morestack, so that crashes during a stack split
give complete traces. Also mark stack segment boundaries
as an aid to debugging.
Correct various line number bugs with yet another attempt
at interpreting the pc/ln table. This one has a chance at
being correct, because I based it on reading src/cmd/ld/lib.c
instead of on reading the documentation.
Fixes #1138.
Fixes #1430.
Fixes #1461.
throw: runtime: split stack overflow
runtime.throw+0x3e /home/rsc/g/go2/src/pkg/runtime/runtime.c:78
runtime.throw(0x81880af, 0xf75c8b18)
runtime.newstack+0xad /home/rsc/g/go2/src/pkg/runtime/proc.c:728
runtime.newstack()
runtime.morestack+0x4f /home/rsc/g/go2/src/pkg/runtime/386/asm.s:184
runtime.morestack()
----- morestack called from stack: -----
runtime.new+0x1a /home/rsc/g/go2/src/pkg/runtime/malloc.c:288
runtime.new(0x1, 0x0, 0x0)
gongo.makeBoard+0x33 /tmp/Gongo/gongo_robot_test.go:344
gongo.makeBoard(0x809d238, 0x1, 0xf76092c8, 0x1)
----- stack segment boundary -----
gongo.checkEasyScore+0xcc /tmp/Gongo/gongo_robot_test.go:287
gongo.checkEasyScore(0xf764b710, 0x0, 0x809d238, 0x1)
gongo.TestEasyScore+0x8c /tmp/Gongo/gongo_robot_test.go:255
gongo.TestEasyScore(0xf764b710, 0x818a990)
testing.tRunner+0x2f /home/rsc/g/go2/src/pkg/testing/testing.go:132
testing.tRunner(0xf764b710, 0xf763b5dc, 0x0)
runtime.goexit /home/rsc/g/go2/src/pkg/runtime/proc.c:149
runtime.goexit()
R=ken2, r
CC=golang-dev
https://golang.org/cl/4000053
Diffstat (limited to 'src/pkg/runtime/runtime.c')
| -rw-r--r-- | src/pkg/runtime/runtime.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/pkg/runtime/runtime.c b/src/pkg/runtime/runtime.c index 284b1e4585..e3a20d48af 100644 --- a/src/pkg/runtime/runtime.c +++ b/src/pkg/runtime/runtime.c @@ -528,14 +528,22 @@ void runtime·Caller(int32 skip, uintptr retpc, String retfile, int32 retline, bool retbool) { Func *f; + uintptr pc; - if(runtime·callers(1+skip, &retpc, 1) == 0 || (f = runtime·findfunc(retpc-1)) == nil) { + if(runtime·callers(1+skip, &retpc, 1) == 0) { retfile = runtime·emptystring; retline = 0; retbool = false; + } else if((f = runtime·findfunc(retpc)) == nil) { + retfile = runtime·emptystring; + retline = 0; + retbool = true; // have retpc at least } else { retfile = f->src; - retline = runtime·funcline(f, retpc-1); + pc = retpc; + if(pc > f->entry) + pc--; + retline = runtime·funcline(f, pc); retbool = true; } FLUSH(&retfile); |
