1// Copyright 2017 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package runtime_test 6 7import ( 8 "fmt" 9 "runtime" 10 "strings" 11) 12 13func ExampleFrames() { 14 c := func() { 15 // Ask runtime.Callers for up to 10 pcs, including runtime.Callers itself. 16 pc := make([]uintptr, 10) 17 n := runtime.Callers(0, pc) 18 if n == 0 { 19 // No pcs available. Stop now. 20 // This can happen if the first argument to runtime.Callers is large. 21 return 22 } 23 24 pc = pc[:n] // pass only valid pcs to runtime.CallersFrames 25 frames := runtime.CallersFrames(pc) 26 27 // Loop to get frames. 28 // A fixed number of pcs can expand to an indefinite number of Frames. 29 for { 30 frame, more := frames.Next() 31 // To keep this example's output stable 32 // even if there are changes in the testing package, 33 // stop unwinding when we leave package runtime. 34 if !strings.Contains(frame.File, "runtime/") && !strings.Contains(frame.File, "/test/") { 35 break 36 } 37 fmt.Printf("- more:%v | %s\n", more, frame.Function) 38 if !more { 39 break 40 } 41 } 42 } 43 44 b := func() { c() } 45 a := func() { b() } 46 47 a() 48 // Output: 49 // - more:true | runtime.Callers 50 // - more:true | runtime_test.ExampleFrames..func1 51 // - more:true | runtime_test.ExampleFrames..func2 52 // - more:true | runtime_test.ExampleFrames..func3 53 // - more:true | runtime_test.ExampleFrames 54} 55