diff options
| author | David du Colombier <0intro@gmail.com> | 2015-07-28 20:48:10 +0200 |
|---|---|---|
| committer | David du Colombier <0intro@gmail.com> | 2015-07-28 19:01:41 +0000 |
| commit | 68117a91ae3ca306007d89440c8d6e71ffc5bdd5 (patch) | |
| tree | 468c07d25c5f4ca222656c5b3987a939575cb926 /src/runtime | |
| parent | 17efbfc5609fc9f2d95e5473250d740a9e5608bc (diff) | |
| download | go-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.go | 17 |
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)) |
