Commit 56580756 authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder

runtime: improve ExampleFrames

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: 's avatarAustin Clements <austin@google.com>
parent 0c0c94a9
...@@ -7,21 +7,37 @@ package runtime_test ...@@ -7,21 +7,37 @@ package runtime_test
import ( import (
"fmt" "fmt"
"runtime" "runtime"
"strings"
) )
func ExampleFrames() { func ExampleFrames() {
c := func() { c := func() {
pc := make([]uintptr, 5) // Ask runtime.Callers for up to 10 pcs, including runtime.Callers itself.
pc := make([]uintptr, 10)
n := runtime.Callers(0, pc) n := runtime.Callers(0, pc)
if n == 0 { if n == 0 {
// No pcs available. Stop now.
// This can happen if the first argument to runtime.Callers is large.
return return
} }
frames := runtime.CallersFrames(pc[:n]) pc = pc[:n] // pass only valid pcs to runtime.CallersFrames
var frame runtime.Frame frames := runtime.CallersFrames(pc)
for i, more := 0, true; more && i < 5; i++ {
frame, more = frames.Next() // Loop to get frames.
fmt.Printf("- %s\n", frame.Function) // 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
}
} }
} }
...@@ -30,9 +46,9 @@ func ExampleFrames() { ...@@ -30,9 +46,9 @@ func ExampleFrames() {
a() a()
// Output: // Output:
// - runtime.Callers // - more:true | runtime.Callers
// - runtime_test.ExampleFrames.func1 // - more:true | runtime_test.ExampleFrames.func1
// - runtime_test.ExampleFrames.func2 // - more:true | runtime_test.ExampleFrames.func2
// - runtime_test.ExampleFrames.func3 // - more:true | runtime_test.ExampleFrames.func3
// - runtime_test.ExampleFrames // - more:true | runtime_test.ExampleFrames
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment