mirror of
https://github.com/golang/go
synced 2024-11-18 12:04:57 -07:00
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>
This commit is contained in:
parent
c8b42f9aa5
commit
45cd312394
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user