Source file
src/cmd/trace/pprof_test.go
1
2
3
4
5 package main
6
7 import (
8 "bytes"
9 "net/http"
10 "os"
11 "runtime/trace"
12 "strings"
13 "testing"
14 "testing/synctest"
15 "time"
16
17 itrace "internal/trace"
18 "internal/trace/testtrace"
19 )
20
21
22 func TestSyscallProfile74850(t *testing.T) {
23 testtrace.MustHaveSyscallEvents(t)
24
25 var buf bytes.Buffer
26 err := trace.Start(&buf)
27 if err != nil {
28 t.Fatalf("start tracing: %v", err)
29 }
30
31 synctest.Test(t, func(t *testing.T) {
32 go hidden1(t)
33 go hidden2(t)
34 go visible(t)
35 synctest.Wait()
36 time.Sleep(1 * time.Millisecond)
37 synctest.Wait()
38 })
39 trace.Stop()
40
41 if t.Failed() {
42 return
43 }
44
45 parsed, err := parseTrace(&buf, int64(buf.Len()))
46 if err != nil {
47 t.Fatalf("parsing trace: %v", err)
48 }
49
50 records, err := pprofByGoroutine(computePprofSyscall(), parsed)(&http.Request{})
51 if err != nil {
52 t.Fatalf("failed to generate pprof: %v\n", err)
53 }
54
55 for _, r := range records {
56 t.Logf("Record: n=%d, total=%v", r.Count, r.Time)
57 for _, f := range r.Stack {
58 t.Logf("\t%s", f.Func)
59 t.Logf("\t\t%s:%d @ 0x%x", f.File, f.Line, f.PC)
60 }
61 }
62 if len(records) == 0 {
63 t.Error("empty profile")
64 }
65
66
67 wantSymbols := []string{"cmd/trace.visible", "cmd/trace.hidden1", "cmd/trace.hidden2"}
68 haveSymbols := make([]bool, len(wantSymbols))
69 for _, r := range records {
70 for _, f := range r.Stack {
71 for i, s := range wantSymbols {
72 if strings.Contains(f.Func, s) {
73 haveSymbols[i] = true
74 }
75 }
76 }
77 }
78 for i, have := range haveSymbols {
79 if !have {
80 t.Errorf("expected %s in syscall profile", wantSymbols[i])
81 }
82 }
83 }
84
85
86
87
88 func TestFillPCsOverflow(t *testing.T) {
89 var pcs [pprofMaxStack]uint64
90
91
92 n := pprofMaxStack + 10
93 frames := make([]itrace.StackFrame, n)
94 for i := range frames {
95 frames[i].PC = uint64(0x1000 + i)
96 }
97 stack := itrace.MakeStack(frames)
98
99
100 pcsForStack(stack, &pcs)
101
102
103 for i := 0; i < pprofMaxStack; i++ {
104 if pcs[i] != uint64(0x1000+i) {
105 t.Errorf("pcs[%d] = %#x, want %#x", i, pcs[i], 0x1000+i)
106 }
107 }
108 }
109
110 func stat(t *testing.T) {
111 _, err := os.Stat(".")
112 if err != nil {
113 t.Errorf("os.Stat: %v", err)
114 }
115 }
116
117 func hidden1(t *testing.T) {
118 stat(t)
119 }
120
121 func hidden2(t *testing.T) {
122 stat(t)
123 stat(t)
124 }
125
126 func visible(t *testing.T) {
127 stat(t)
128 time.Sleep(1 * time.Millisecond)
129 }
130
View as plain text