aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorDavid du Colombier <0intro@gmail.com>2015-07-28 20:48:10 +0200
committerDavid du Colombier <0intro@gmail.com>2015-07-28 19:01:41 +0000
commit68117a91ae3ca306007d89440c8d6e71ffc5bdd5 (patch)
tree468c07d25c5f4ca222656c5b3987a939575cb926 /src/runtime
parent17efbfc5609fc9f2d95e5473250d740a9e5608bc (diff)
downloadgo-68117a91ae3ca306007d89440c8d6e71ffc5bdd5.tar.xz
runtime: fix x86 stack trace for call to heap memory on Plan 9
Russ Cox fixed this issue for other systems in CL 12026, but the Plan 9 part was forgotten. Fixes #11656. Change-Id: I91c033687987ba43d13ad8f42e3fe4c7a78e6075 Reviewed-on: https://go-review.googlesource.com/12762 Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/os3_plan9.go17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/runtime/os3_plan9.go b/src/runtime/os3_plan9.go
index 248576a102..03e9410424 100644
--- a/src/runtime/os3_plan9.go
+++ b/src/runtime/os3_plan9.go
@@ -49,20 +49,31 @@ func sighandler(_ureg *ureg, note *byte, gp *g) int {
memmove(unsafe.Pointer(_g_.m.notesig), unsafe.Pointer(note), uintptr(len(notestr)+1))
gp.sig = uint32(sig)
gp.sigpc = c.pc()
+
+ pc := uintptr(c.pc())
+ sp := uintptr(c.sp())
+
+ // If we don't recognize the PC as code
+ // but we do recognize the top pointer on the stack as code,
+ // then assume this was a call to non-code and treat like
+ // pc == 0, to make unwinding show the context.
+ if pc != 0 && findfunc(pc) == nil && findfunc(*(*uintptr)(unsafe.Pointer(sp))) != nil {
+ pc = 0
+ }
+
// Only push sigpanic if PC != 0.
//
// If PC == 0, probably panicked because of a call to a nil func.
// Not pushing that onto SP will make the trace look like a call
// to sigpanic instead. (Otherwise the trace will end at
// sigpanic and we won't get to see who faulted).
- if c.pc() != 0 {
- sp := c.sp()
+ if pc != 0 {
if regSize > ptrSize {
sp -= ptrSize
*(*uintptr)(unsafe.Pointer(sp)) = 0
}
sp -= ptrSize
- *(*uintptr)(unsafe.Pointer(sp)) = c.pc()
+ *(*uintptr)(unsafe.Pointer(sp)) = pc
c.setsp(sp)
}
c.setpc(funcPC(sigpanic))