mirror of
https://github.com/golang/go
synced 2024-11-05 17:46:16 -07:00
runtime: strongly encourage CallersFrames with the result of Callers
For historical reasons, it's still commonplace to iterate over the slice returned by runtime.Callers and call FuncForPC on each PC. This is broken in gccgo and somewhat broken in gc and will become more broken in gc with mid-stack inlining. In Go 1.7, we introduced runtime.CallersFrames to deal with these problems, but didn't strongly direct people toward using it. Reword the documentation on runtime.Callers to more strongly encourage people to use CallersFrames and explicitly discourage them from iterating over the PCs or using FuncForPC on the results. Fixes #19426. Change-Id: Id0d14cb51a0e9521c8fdde9612610f2c2b9383c4 Reviewed-on: https://go-review.googlesource.com/37726 Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
1fa063cbb6
commit
e4f73769bc
@ -202,11 +202,13 @@ func Caller(skip int) (pc uintptr, file string, line int, ok bool) {
|
|||||||
// 1 identifying the caller of Callers.
|
// 1 identifying the caller of Callers.
|
||||||
// It returns the number of entries written to pc.
|
// It returns the number of entries written to pc.
|
||||||
//
|
//
|
||||||
// Note that since each slice entry pc[i] is a return program counter,
|
// To translate these PCs into symbolic information such as function
|
||||||
// looking up the file and line for pc[i] (for example, using (*Func).FileLine)
|
// names and line numbers, use CallersFrames. CallersFrames accounts
|
||||||
// will normally return the file and line number of the instruction immediately
|
// for inlined functions and adjusts the return program counters into
|
||||||
// following the call.
|
// call program counters. Iterating over the returned slice of PCs
|
||||||
// To easily look up file/line information for the call sequence, use Frames.
|
// directly is discouraged, as is using FuncForPC on any of the
|
||||||
|
// returned PCs, since these cannot account for inlining or return
|
||||||
|
// program counter adjustment.
|
||||||
func Callers(skip int, pc []uintptr) int {
|
func Callers(skip int, pc []uintptr) int {
|
||||||
// runtime.callers uses pc.array==nil as a signal
|
// runtime.callers uses pc.array==nil as a signal
|
||||||
// to print a stack trace. Pick off 0-length pc here
|
// to print a stack trace. Pick off 0-length pc here
|
||||||
|
Loading…
Reference in New Issue
Block a user