diff options
| author | Austin Clements <austin@google.com> | 2019-08-06 21:37:37 -0400 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2020-04-29 20:33:30 +0000 |
| commit | 45cd312394ebbcdce956952f0e269a82d89e6639 (patch) | |
| tree | 3bbdfc69a36a2ee8906d0cc25d293f8650809722 /src | |
| parent | c8b42f9aa5146638c62e8420147595b3533c2a78 (diff) | |
| download | go-45cd312394ebbcdce956952f0e269a82d89e6639.tar.xz | |
runtime: fix debuglog traceback printing off-by-one
The debuglog traceback printer wasn't adjusting for call/return PCs.
Change-Id: I98dda1c0f22cd78651d88124ea51dc166dc91c7a
Reviewed-on: https://go-review.googlesource.com/c/go/+/227646
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/runtime/debuglog.go | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/runtime/debuglog.go b/src/runtime/debuglog.go index 100f2d370a..3ce3273f4d 100644 --- a/src/runtime/debuglog.go +++ b/src/runtime/debuglog.go @@ -665,13 +665,17 @@ func (r *debugLogReader) printVal() bool { print("..(", r.uvarint(), " more bytes)..") case debugLogPC: - printDebugLogPC(uintptr(r.uvarint())) + printDebugLogPC(uintptr(r.uvarint()), false) case debugLogTraceback: n := int(r.uvarint()) for i := 0; i < n; i++ { print("\n\t") - printDebugLogPC(uintptr(r.uvarint())) + // gentraceback PCs are always return PCs. + // Convert them to call PCs. + // + // TODO(austin): Expand inlined frames. + printDebugLogPC(uintptr(r.uvarint()), true) } } @@ -794,9 +798,17 @@ func printDebugLog() { printunlock() } -func printDebugLogPC(pc uintptr) { - print(hex(pc)) +// printDebugLogPC prints a single symbolized PC. If returnPC is true, +// pc is a return PC that must first be converted to a call PC. +func printDebugLogPC(pc uintptr, returnPC bool) { fn := findfunc(pc) + if returnPC && (!fn.valid() || pc > fn.entry) { + // TODO(austin): Don't back up if the previous frame + // was a sigpanic. + pc-- + } + + print(hex(pc)) if !fn.valid() { print(" [unknown PC]") } else { |
