diff options
author | Keith Randall <khr@google.com> | 2019-09-23 14:36:48 -0700 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2019-11-08 21:05:17 +0000 |
commit | 9ee6ba089dc9dd2402bccd9ed28b07140f76de15 (patch) | |
tree | 49f74474a7613c22e062d96cd3d33b21eb4a4380 /src/runtime/traceback.go | |
parent | 9e914f55dded9f779aae86cfb2e989bc9a1d3ea4 (diff) | |
download | go-9ee6ba089dc9dd2402bccd9ed28b07140f76de15.tar.gz go-9ee6ba089dc9dd2402bccd9ed28b07140f76de15.zip |
runtime: fix line number for faulting instructions
Unlike function calls, when processing instructions that directly
fault we must not subtract 1 from the pc before looking up the
file/line information.
Since the file/line lookup unconditionally subtracts 1, add 1 to
the faulting instruction PCs to compensate.
Fixes #34123
Change-Id: Ie7361e3d2f84a0d4f48d97e5a9e74f6291ba7a8b
Reviewed-on: https://go-review.googlesource.com/c/go/+/196962
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
Diffstat (limited to 'src/runtime/traceback.go')
-rw-r--r-- | src/runtime/traceback.go | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go index dc2a7a36935..944c8473d25 100644 --- a/src/runtime/traceback.go +++ b/src/runtime/traceback.go @@ -340,7 +340,20 @@ func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max in pc := frame.pc // backup to CALL instruction to read inlining info (same logic as below) tracepc := pc - if (n > 0 || flags&_TraceTrap == 0) && frame.pc > f.entry && !waspanic { + // Normally, pc is a return address. In that case, we want to look up + // file/line information using pc-1, because that is the pc of the + // call instruction (more precisely, the last byte of the call instruction). + // Callers expect the pc buffer to contain return addresses and do the + // same -1 themselves, so we keep pc unchanged. + // When the pc is from a signal (e.g. profiler or segv) then we want + // to look up file/line information using pc, and we store pc+1 in the + // pc buffer so callers can unconditionally subtract 1 before looking up. + // See issue 34123. + // The pc can be at function entry when the frame is initialized without + // actually running code, like runtime.mstart. + if (n == 0 && flags&_TraceTrap != 0) || waspanic || pc == f.entry { + pc++ + } else { tracepc-- } |