2017-02-11 15:56:16 -07:00
|
|
|
// 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"
|
2017-04-19 16:39:04 -06:00
|
|
|
"strings"
|
2017-02-11 15:56:16 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
func ExampleFrames() {
|
|
|
|
c := func() {
|
2017-04-19 16:39:04 -06:00
|
|
|
// Ask runtime.Callers for up to 10 pcs, including runtime.Callers itself.
|
|
|
|
pc := make([]uintptr, 10)
|
2017-02-11 15:56:16 -07:00
|
|
|
n := runtime.Callers(0, pc)
|
|
|
|
if n == 0 {
|
2017-04-19 16:39:04 -06:00
|
|
|
// No pcs available. Stop now.
|
|
|
|
// This can happen if the first argument to runtime.Callers is large.
|
2017-02-11 15:56:16 -07:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-04-19 16:39:04 -06:00
|
|
|
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
|
|
|
|
}
|
2017-02-11 15:56:16 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
b := func() { c() }
|
|
|
|
a := func() { b() }
|
|
|
|
|
|
|
|
a()
|
|
|
|
// Output:
|
2017-04-19 16:39:04 -06:00
|
|
|
// - 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
|
2017-02-11 15:56:16 -07:00
|
|
|
}
|