/usr/share/go-1.10/test/inline_callers.go is in golang-1.10-src 1.10.1-1ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | // run -gcflags=-l=4
// 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 main
import (
"fmt"
"runtime"
)
var skip int
var npcs int
var pcs = make([]uintptr, 32)
func f() {
g()
}
func g() {
h()
}
func h() {
npcs = runtime.Callers(skip, pcs)
}
func testCallers(skp int) (frames []string) {
skip = skp
f()
for i := 0; i < npcs; i++ {
fn := runtime.FuncForPC(pcs[i])
frames = append(frames, fn.Name())
if fn.Name() == "main.main" {
break
}
}
return
}
func testCallersFrames(skp int) (frames []string) {
skip = skp
f()
callers := pcs[:npcs]
ci := runtime.CallersFrames(callers)
for {
frame, more := ci.Next()
frames = append(frames, frame.Function)
if !more || frame.Function == "main.main" {
break
}
}
return
}
var expectedFrames [][]string = [][]string{
0: {"runtime.Callers", "main.testCallers", "main.main"},
1: {"main.testCallers", "main.main"},
2: {"main.testCallers", "runtime.skipPleaseUseCallersFrames", "main.main"},
3: {"main.testCallers", "runtime.skipPleaseUseCallersFrames", "main.main"},
4: {"main.testCallers", "runtime.skipPleaseUseCallersFrames", "main.main"},
5: {"main.main"},
}
var allFrames = []string{"runtime.Callers", "main.h", "main.g", "main.f", "main.testCallersFrames", "main.main"}
func same(xs, ys []string) bool {
if len(xs) != len(ys) {
return false
}
for i := range xs {
if xs[i] != ys[i] {
return false
}
}
return true
}
func main() {
for i := 0; i <= 5; i++ {
frames := testCallers(i)
expected := expectedFrames[i]
if !same(frames, expected) {
fmt.Printf("testCallers(%d):\n got %v\n want %v\n", i, frames, expected)
}
frames = testCallersFrames(i)
expected = allFrames[i:]
if !same(frames, expected) {
fmt.Printf("testCallersFrames(%d):\n got %v\n want %v\n", i, frames, expected)
}
}
}
|