aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2019-08-06 21:37:37 -0400
committerAustin Clements <austin@google.com>2020-04-29 20:33:30 +0000
commit45cd312394ebbcdce956952f0e269a82d89e6639 (patch)
tree3bbdfc69a36a2ee8906d0cc25d293f8650809722 /src
parentc8b42f9aa5146638c62e8420147595b3533c2a78 (diff)
downloadgo-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.go20
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 {