mirror of
https://github.com/golang/go
synced 2024-11-19 10:04:56 -07:00
565807566e
CL 40876 changed ExampleFrames so that the output was stable with and without mid-stack inlining. However, that change lost some of the pedagogical and copy/paste value of the example. It was unclear why both more and i were being tracked, and whether the 5 in i < 5 is related to len(pc), and if so, why and how. This CL rewrites the example with lots more comments, and such that the core structure more closely matches normal usage, and such that it is obvious which lines of code should be deleted when copying. As a bonus, it also now illustrates Frame.File. Change-Id: Iab73541dd096657ddf79c5795337e8b596d89740 Reviewed-on: https://go-review.googlesource.com/41136 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package runtime_test
|
|
|
|
import (
|
|
"fmt"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
func ExampleFrames() {
|
|
c := func() {
|
|
// Ask runtime.Callers for up to 10 pcs, including runtime.Callers itself.
|
|
pc := make([]uintptr, 10)
|
|
n := runtime.Callers(0, pc)
|
|
if n == 0 {
|
|
// No pcs available. Stop now.
|
|
// This can happen if the first argument to runtime.Callers is large.
|
|
return
|
|
}
|
|
|
|
pc = pc[:n] // pass only valid pcs to runtime.CallersFrames
|
|
frames := runtime.CallersFrames(pc)
|
|
|
|
// Loop to get frames.
|
|
// A fixed number of pcs can expand to an indefinite number of Frames.
|
|
for {
|
|
frame, more := frames.Next()
|
|
// To keep this example's output stable
|
|
// even if there are changes in the testing package,
|
|
// stop unwinding when we leave package runtime.
|
|
if !strings.Contains(frame.File, "runtime/") {
|
|
break
|
|
}
|
|
fmt.Printf("- more:%v | %s\n", more, frame.Function)
|
|
if !more {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
b := func() { c() }
|
|
a := func() { b() }
|
|
|
|
a()
|
|
// Output:
|
|
// - more:true | runtime.Callers
|
|
// - more:true | runtime_test.ExampleFrames.func1
|
|
// - more:true | runtime_test.ExampleFrames.func2
|
|
// - more:true | runtime_test.ExampleFrames.func3
|
|
// - more:true | runtime_test.ExampleFrames
|
|
}
|