runtime: use inlining tables to generate accurate tracebacks
The code in https://play.golang.org/p/aYQPrTtzoK now produces the
following stack trace:
goroutine 1 [running]:
main.(*point).negate(...)
/tmp/go/main.go:8
main.main()
/tmp/go/main.go:14 +0x23
Previously the stack trace missed the inlined call:
goroutine 1 [running]:
main.main()
/tmp/go/main.go:14 +0x23
Fixes #10152.
Updates #19348.
Change-Id: Ib43c67012f53da0ef1a1e69bcafb65b57d9cecb2
Reviewed-on: https://go-review.googlesource.com/37233
Run-TryBot: David Lazar <lazard@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go
index 274d5c4..39ef8a2 100644
--- a/src/runtime/traceback.go
+++ b/src/runtime/traceback.go
@@ -332,6 +332,7 @@
}
}
if printing {
+ // assume skip=0 for printing
if (flags&_TraceRuntimeFrames) != 0 || showframe(f, gp, nprint == 0) {
// Print during crash.
// main(0x1, 0x2, 0x3)
@@ -341,6 +342,21 @@
if (n > 0 || flags&_TraceTrap == 0) && frame.pc > f.entry && !waspanic {
tracepc--
}
+ file, line := funcline(f, tracepc)
+ inldata := funcdata(f, _FUNCDATA_InlTree)
+ if inldata != nil {
+ inltree := (*[1 << 20]inlinedCall)(inldata)
+ ix := pcdatavalue(f, _PCDATA_InlTreeIndex, tracepc, nil)
+ for ix != -1 {
+ name := funcnameFromNameoff(f, inltree[ix].func_)
+ print(name, "(...)\n")
+ print("\t", file, ":", line, "\n")
+
+ file = funcfile(f, inltree[ix].file)
+ line = inltree[ix].line
+ ix = inltree[ix].parent
+ }
+ }
name := funcname(f)
if name == "runtime.gopanic" {
name = "panic"
@@ -358,7 +374,6 @@
print(hex(argp[i]))
}
print(")\n")
- file, line := funcline(f, tracepc)
print("\t", file, ":", line)
if frame.pc > f.entry {
print(" +", hex(frame.pc-f.entry))